/*! \file domain_algorithm_compute_connectivity.cpp \author Ha NGUYEN \since 15 Jul 2016 \date 15 Jul 2016 \brief Algorithm for compute_connectivity on an domain. */ #include "domain_algorithm_compute_connectivity.hpp" #include "compute_connectivity_domain.hpp" #include "mesh.hpp" #include "domain.hpp" #include "grid.hpp" #include "grid_transformation_factory_impl.hpp" namespace xios { CGenericAlgorithmTransformation* CDomainAlgorithmComputeConnectivity::create(CGrid* gridDst, CGrid* gridSrc, CTransformation* transformation, int elementPositionInGrid, std::map& elementPositionInGridSrc2ScalarPosition, std::map& elementPositionInGridSrc2AxisPosition, std::map& elementPositionInGridSrc2DomainPosition, std::map& elementPositionInGridDst2ScalarPosition, std::map& elementPositionInGridDst2AxisPosition, std::map& elementPositionInGridDst2DomainPosition) TRY { std::vector domainListDestP = gridDst->getDomains(); std::vector domainListSrcP = gridSrc->getDomains(); CComputeConnectivityDomain* compute_connectivityDomain = dynamic_cast (transformation); int domainDstIndex = elementPositionInGridDst2DomainPosition[elementPositionInGrid]; int domainSrcIndex = elementPositionInGridSrc2DomainPosition[elementPositionInGrid]; return (new CDomainAlgorithmComputeConnectivity(domainListDestP[domainDstIndex], domainListSrcP[domainSrcIndex], compute_connectivityDomain)); } CATCH bool CDomainAlgorithmComputeConnectivity::registerTrans() TRY { CGridTransformationFactory::registerTransformation(TRANS_COMPUTE_CONNECTIVITY_DOMAIN, create); } CATCH CDomainAlgorithmComputeConnectivity::CDomainAlgorithmComputeConnectivity(CDomain* domainDestination, CDomain* domainSource, CComputeConnectivityDomain* compute_connectivityDomain) : CDomainAlgorithmTransformation(domainDestination, domainSource) TRY { this->type_ = (ELEMENT_NO_MODIFICATION_WITHOUT_DATA); compute_connectivityDomain->checkValid(domainDestination); int& nbNeighborMax = compute_connectivityDomain->n_neighbor_max; CArray& nbNeighbor = compute_connectivityDomain->n_neighbor; CArray& localNeighbors = compute_connectivityDomain->local_neighbor; int type = 1; // Edge type switch (compute_connectivityDomain->type) { case CComputeConnectivityDomain::type_attr::node : type = 0; break; case CComputeConnectivityDomain::type_attr::edge : type = 1; break; default: break; } computeLocalConnectivity(type, domainDestination, nbNeighborMax, nbNeighbor, localNeighbors); } CATCH /*! * Compute local connectivity of a domain * \param[in] type type of connectivity (node or edge) * \param[in] domain domain on which we calculate local connectivity * \param[in/out] nbConnectivityMax maximum number of neighbor a cell of domain has * \param[in/out] nbConnectivity number of neighbor a cell has * \param[in/out] localConnectivity localConnectivity local index of neighbor of a cell */ void CDomainAlgorithmComputeConnectivity::computeLocalConnectivity(int type, CDomain* domain, int& nbConnectivityMax, CArray& nbConnectivity, CArray& localConnectivity) TRY { CMesh mesh; CArray& bounds_lon = domain->bounds_lon_1d; CArray& bounds_lat = domain->bounds_lat_1d; int ncell = bounds_lon.shape()[1]; CArray localIndex(ncell); for (int idx = 0; idx * >& dataAuxInputs) { } }