source: XIOS/dev/XIOS_DEV_CMIP6/src/transformation/domain_algorithm_compute_connectivity.cpp @ 1260

Last change on this file since 1260 was 978, checked in by mhnguyen, 7 years ago

Correcting various bugs relating to transformation

+) Fix the order of transformation selection
+) Correct domain transformation selection
+) Reorganize test_remap

Test
+) On Curie
+) All tests pass

File size: 4.8 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(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)
26{
27  std::vector<CDomain*> domainListDestP = gridDst->getDomains();
28  std::vector<CDomain*> domainListSrcP  = gridSrc->getDomains();
29
30  CComputeConnectivityDomain* compute_connectivityDomain = dynamic_cast<CComputeConnectivityDomain*> (transformation);
31  int domainDstIndex = elementPositionInGridDst2DomainPosition[elementPositionInGrid];
32  int domainSrcIndex = elementPositionInGridSrc2DomainPosition[elementPositionInGrid];
33
34  return (new CDomainAlgorithmComputeConnectivity(domainListDestP[domainDstIndex], domainListSrcP[domainSrcIndex], compute_connectivityDomain));
35}
36
37bool CDomainAlgorithmComputeConnectivity::registerTrans()
38{
39  CGridTransformationFactory<CDomain>::registerTransformation(TRANS_COMPUTE_CONNECTIVITY_DOMAIN, create);
40}
41
42CDomainAlgorithmComputeConnectivity::CDomainAlgorithmComputeConnectivity(CDomain* domainDestination, CDomain* domainSource,
43                                                                         CComputeConnectivityDomain* compute_connectivityDomain)
44: CDomainAlgorithmTransformation(domainDestination, domainSource)
45{
46  this->type_ = (ELEMENT_NO_MODIFICATION_WITHOUT_DATA);
47  compute_connectivityDomain->checkValid(domainDestination);
48  int& nbNeighborMax = compute_connectivityDomain->n_neighbor_max;
49  CArray<int,1>& nbNeighbor = compute_connectivityDomain->n_neighbor;
50  CArray<int,2>& localNeighbors = compute_connectivityDomain->local_neighbor;
51  int type = 1; // Edge type
52  switch (compute_connectivityDomain->type)
53  {
54    case CComputeConnectivityDomain::type_attr::node :
55      type = 0;
56      break;
57    case CComputeConnectivityDomain::type_attr::edge :
58      type = 1;
59      break;
60    default:
61      break;
62  }
63
64  computeLocalConnectivity(type, domainDestination, nbNeighborMax, nbNeighbor, localNeighbors);
65}
66
67/*!
68 *  Compute local connectivity of a domain
69 *  \param[in] type type of connectivity (node or edge)
70 *  \param[in] domain domain on which we calculate local connectivity
71 *  \param[in/out] nbConnectivityMax maximum number of neighbor a cell of domain has
72 *  \param[in/out] nbConnectivity number of neighbor a cell has
73 *  \param[in/out] localConnectivity localConnectivity local index of neighbor of a cell
74 */
75void CDomainAlgorithmComputeConnectivity::computeLocalConnectivity(int type,
76                                                                  CDomain* domain,
77                                                                  int& nbConnectivityMax,
78                                                                  CArray<int,1>& nbConnectivity,
79                                                                  CArray<int,2>& localConnectivity)
80{
81
82  CMesh mesh;
83
84  CArray<double,2>& bounds_lon = domain->bounds_lon_1d;
85  CArray<double,2>& bounds_lat = domain->bounds_lat_1d;
86  int ncell = bounds_lon.shape()[1];
87  CArray<int,1> localIndex(ncell);
88  for (int idx = 0; idx <ncell; ++idx) localIndex(idx) = idx;
89
90  mesh.getLocalNghbFaces(type, localIndex, bounds_lon, bounds_lat, localConnectivity, nbConnectivity);
91  nbConnectivityMax = 0;
92  for (int idx =0; idx < nbConnectivity.numElements(); ++idx)
93    if (nbConnectivityMax < nbConnectivity(idx)) nbConnectivityMax = nbConnectivity(idx);
94}
95
96
97
98/*!
99  Compute the index mapping between domain on grid source and one on grid destination
100*/
101void CDomainAlgorithmComputeConnectivity::computeIndexSourceMapping_(const std::vector<CArray<double,1>* >& dataAuxInputs)
102{
103}
104
105}
Note: See TracBrowser for help on using the repository browser.