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

Last change on this file since 2007 was 2007, checked in by ymipsl, 3 years ago
  • fix some problem in transformation
  • implement new temporal splitting transformation

YM

  • Property svn:eol-style set to native
  • Property svn:executable set to *
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(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  this->type_ = (ELEMENT_NO_MODIFICATION_WITHOUT_DATA);
54  compute_connectivityDomain->checkValid(domainDestination);
55  int& nbNeighborMax = compute_connectivityDomain->n_neighbor_max;
56  CArray<int,1>& nbNeighbor = compute_connectivityDomain->n_neighbor;
57  CArray<int,2>& localNeighbors = compute_connectivityDomain->local_neighbor;
58  int type = 1; // Edge type
59  switch (compute_connectivityDomain->type)
60  {
61    case CComputeConnectivityDomain::type_attr::node :
62      type = 0;
63      break;
64    case CComputeConnectivityDomain::type_attr::edge :
65      type = 1;
66      break;
67    default:
68      break;
69  }
70
71  computeLocalConnectivity(type, domainDestination, nbNeighborMax, nbNeighbor, localNeighbors);
72}
73CATCH
74
75/*!
76 *  Compute local connectivity of a domain
77 *  \param[in] type type of connectivity (node or edge)
78 *  \param[in] domain domain on which we calculate local connectivity
79 *  \param[in/out] nbConnectivityMax maximum number of neighbor a cell of domain has
80 *  \param[in/out] nbConnectivity number of neighbor a cell has
81 *  \param[in/out] localConnectivity localConnectivity local index of neighbor of a cell
82 */
83void CDomainAlgorithmComputeConnectivity::computeLocalConnectivity(int type,
84                                                                  CDomain* domain,
85                                                                  int& nbConnectivityMax,
86                                                                  CArray<int,1>& nbConnectivity,
87                                                                  CArray<int,2>& localConnectivity)
88TRY
89{
90
91  CMesh mesh;
92
93  CArray<double,2>& bounds_lon = domain->bounds_lon_1d;
94  CArray<double,2>& bounds_lat = domain->bounds_lat_1d;
95  int ncell = bounds_lon.shape()[1];
96  CArray<int,1> localIndex(ncell);
97  for (int idx = 0; idx <ncell; ++idx) localIndex(idx) = idx;
98
99  mesh.getLocalNghbFaces(type, localIndex, bounds_lon, bounds_lat, localConnectivity, nbConnectivity);
100  nbConnectivityMax = 0;
101  for (int idx =0; idx < nbConnectivity.numElements(); ++idx)
102    if (nbConnectivityMax < nbConnectivity(idx)) nbConnectivityMax = nbConnectivity(idx);
103}
104CATCH
105
106}
Note: See TracBrowser for help on using the repository browser.