source: XIOS/dev/dev_ym/XIOS_COUPLING/src/transformation/domain_algorithm/domain_algorithm_compute_connectivity.cpp @ 2011

Last change on this file since 2011 was 2011, checked in by ymipsl, 3 years ago
  • bug fix when createing mask on server side when overlapping grid
  • implement axis interpolation on pressure coordinate
  • big cleaning in transformation

YM

  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 4.7 KB
Line 
1/*!
2   \file domain_algorithm_compute_connectivity.cpp
3   \author Ha NGUYEN
4   \since 15 Jul 2016
5   \date 15 Jul 2016
6
7   \brief Algorithm for compute_connectivity on an domain.
8 */
9#include "domain_algorithm_compute_connectivity.hpp"
10#include "compute_connectivity_domain.hpp"
11#include "mesh.hpp"
12#include "domain.hpp"
13#include "grid.hpp"
14#include "grid_transformation_factory_impl.hpp"
15
16namespace xios {
17CGenericAlgorithmTransformation* CDomainAlgorithmComputeConnectivity::create(bool isSource, CGrid* gridDst, CGrid* gridSrc,
18                                                                     CTransformation<CDomain>* transformation,
19                                                                     int elementPositionInGrid,
20                                                                     std::map<int, int>& elementPositionInGridSrc2ScalarPosition,
21                                                                     std::map<int, int>& elementPositionInGridSrc2AxisPosition,
22                                                                     std::map<int, int>& elementPositionInGridSrc2DomainPosition,
23                                                                     std::map<int, int>& elementPositionInGridDst2ScalarPosition,
24                                                                     std::map<int, int>& elementPositionInGridDst2AxisPosition,
25                                                                     std::map<int, int>& elementPositionInGridDst2DomainPosition)
26TRY
27{
28  std::vector<CDomain*> domainListDestP = gridDst->getDomains();
29  std::vector<CDomain*> domainListSrcP  = gridSrc->getDomains();
30
31  CComputeConnectivityDomain* compute_connectivityDomain = dynamic_cast<CComputeConnectivityDomain*> (transformation);
32  int domainDstIndex = elementPositionInGridDst2DomainPosition[elementPositionInGrid];
33  int domainSrcIndex = elementPositionInGridSrc2DomainPosition[elementPositionInGrid];
34
35  return (new CDomainAlgorithmComputeConnectivity(isSource, domainListDestP[domainDstIndex], domainListSrcP[domainSrcIndex], compute_connectivityDomain));
36}
37CATCH
38
39bool CDomainAlgorithmComputeConnectivity::dummyRegistered_ = CDomainAlgorithmComputeConnectivity::registerTrans();
40
41bool CDomainAlgorithmComputeConnectivity::registerTrans()
42TRY
43{
44  return CGridTransformationFactory<CDomain>::registerTransformation(TRANS_COMPUTE_CONNECTIVITY_DOMAIN, create);
45}
46CATCH
47
48CDomainAlgorithmComputeConnectivity::CDomainAlgorithmComputeConnectivity(bool isSource, CDomain* domainDestination, CDomain* domainSource,
49                                                                         CComputeConnectivityDomain* compute_connectivityDomain)
50: CAlgorithmTransformationNoDataModification(isSource)
51TRY
52{
53  compute_connectivityDomain->checkValid(domainDestination);
54  int& nbNeighborMax = compute_connectivityDomain->n_neighbor_max;
55  CArray<int,1>& nbNeighbor = compute_connectivityDomain->n_neighbor;
56  CArray<int,2>& localNeighbors = compute_connectivityDomain->local_neighbor;
57  int type = 1; // Edge type
58  switch (compute_connectivityDomain->type)
59  {
60    case CComputeConnectivityDomain::type_attr::node :
61      type = 0;
62      break;
63    case CComputeConnectivityDomain::type_attr::edge :
64      type = 1;
65      break;
66    default:
67      break;
68  }
69
70  computeLocalConnectivity(type, domainDestination, nbNeighborMax, nbNeighbor, localNeighbors);
71}
72CATCH
73
74/*!
75 *  Compute local connectivity of a domain
76 *  \param[in] type type of connectivity (node or edge)
77 *  \param[in] domain domain on which we calculate local connectivity
78 *  \param[in/out] nbConnectivityMax maximum number of neighbor a cell of domain has
79 *  \param[in/out] nbConnectivity number of neighbor a cell has
80 *  \param[in/out] localConnectivity localConnectivity local index of neighbor of a cell
81 */
82void CDomainAlgorithmComputeConnectivity::computeLocalConnectivity(int type,
83                                                                  CDomain* domain,
84                                                                  int& nbConnectivityMax,
85                                                                  CArray<int,1>& nbConnectivity,
86                                                                  CArray<int,2>& localConnectivity)
87TRY
88{
89
90  CMesh mesh;
91
92  CArray<double,2>& bounds_lon = domain->bounds_lon_1d;
93  CArray<double,2>& bounds_lat = domain->bounds_lat_1d;
94  int ncell = bounds_lon.shape()[1];
95  CArray<int,1> localIndex(ncell);
96  for (int idx = 0; idx <ncell; ++idx) localIndex(idx) = idx;
97
98  mesh.getLocalNghbFaces(type, localIndex, bounds_lon, bounds_lat, localConnectivity, nbConnectivity);
99  nbConnectivityMax = 0;
100  for (int idx =0; idx < nbConnectivity.numElements(); ++idx)
101    if (nbConnectivityMax < nbConnectivity(idx)) nbConnectivityMax = nbConnectivity(idx);
102}
103CATCH
104
105}
Note: See TracBrowser for help on using the repository browser.