Changeset 1494
- Timestamp:
- 04/25/18 17:30:25 (6 years ago)
- Location:
- XIOS/dev/XIOS_DEV_CMIP6/src
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
XIOS/dev/XIOS_DEV_CMIP6/src/io/nc4_data_output.cpp
r1459 r1494 557 557 558 558 if (domain->IsWritten(this->filename)) return; 559 560 StdString domid = domain->getDomainOutputName(); 561 562 // The first domain for the same mesh that will be written is that with the highest value of nvertex. 563 // Thus the entire mesh connectivity will be generated at once. 564 if (isWrittenDomain(domid)) return ; 565 else setWrittenDomain(domid); 566 559 567 domain->checkAttributes(); 560 568 if (domain->isEmpty()) … … 567 575 568 576 std::vector<StdString> dim0; 569 StdString domid = domain->getDomainOutputName();570 577 StdString domainName = domain->name; 571 578 domain->assignMesh(domainName, domain->nvertex); … … 593 600 594 601 if (!SuperClassWriter::dimExist(dimTwo)) SuperClassWriter::addDimension(dimTwo, 2); 595 if (!isWrittenDomain(domid)) 596 { 597 dim0.clear(); 598 SuperClassWriter::addVariable(domainName, NC_INT, dim0, compressionLevel); 599 SuperClassWriter::addAttribute("cf_role", StdString("mesh_topology"), &domainName); 600 SuperClassWriter::addAttribute("long_name", StdString("Topology data of 2D unstructured mesh"), &domainName); 601 SuperClassWriter::addAttribute("topology_dimension", 2, &domainName); 602 SuperClassWriter::addAttribute("node_coordinates", node_x + " " + node_y, &domainName); 603 } 602 dim0.clear(); 603 SuperClassWriter::addVariable(domainName, NC_INT, dim0, compressionLevel); 604 SuperClassWriter::addAttribute("cf_role", StdString("mesh_topology"), &domainName); 605 SuperClassWriter::addAttribute("long_name", StdString("Topology data of 2D unstructured mesh"), &domainName); 606 SuperClassWriter::addAttribute("topology_dimension", 2, &domainName); 607 SuperClassWriter::addAttribute("node_coordinates", node_x + " " + node_y, &domainName); 604 608 605 609 try … … 773 777 std::vector<StdSize> countFaceConctv(2) ; 774 778 775 if ( !isWrittenDomain(domid))779 if (domain->nvertex == 1) 776 780 { 777 if (domain->nvertex == 1) 778 { 779 if (domain->isEmpty()) 780 { 781 startNodes[0]=0 ; 782 countNodes[0]=0 ; 783 } 784 else 785 { 786 startNodes[0] = domain->zoom_ibegin-domain->global_zoom_ibegin; 787 countNodes[0] = domain->zoom_ni ; 788 } 789 790 SuperClassWriter::writeData(domain->mesh->node_lat, node_y, isCollective, 0, &startNodes, &countNodes); 791 SuperClassWriter::writeData(domain->mesh->node_lon, node_x, isCollective, 0, &startNodes, &countNodes); 792 } 793 else if (domain->nvertex == 2) 794 { 795 if (domain->isEmpty()) 796 { 797 startEdges[0]=0 ; 798 countEdges[0]=0 ; 799 startNodes[0]=0 ; 800 countNodes[0]=0 ; 801 startEdgeNodes[0]=0; 802 startEdgeNodes[1]=0; 803 countEdgeNodes[0]=0; 804 countEdgeNodes[1]=0; 805 806 } 807 else 808 { 809 startEdges[0] = domain->zoom_ibegin-domain->global_zoom_ibegin; 810 countEdges[0] = domain->zoom_ni; 811 startNodes[0] = domain->mesh->node_start; 812 countNodes[0] = domain->mesh->node_count; 813 startEdgeNodes[0] = domain->zoom_ibegin-domain->global_zoom_ibegin; 814 startEdgeNodes[1] = 0; 815 countEdgeNodes[0] = domain->zoom_ni; 816 countEdgeNodes[1] = 2; 817 } 818 SuperClassWriter::writeData(domain->mesh->node_lat, node_y, isCollective, 0, &startNodes, &countNodes); 819 SuperClassWriter::writeData(domain->mesh->node_lon, node_x, isCollective, 0, &startNodes, &countNodes); 820 SuperClassWriter::writeData(domain->mesh->edge_lat, edge_y, isCollective, 0, &startEdges, &countEdges); 821 SuperClassWriter::writeData(domain->mesh->edge_lon, edge_x, isCollective, 0, &startEdges, &countEdges); 822 SuperClassWriter::writeData(domain->mesh->edge_nodes, edge_nodes, isCollective, 0, &startEdgeNodes, &countEdgeNodes); 823 } 824 else 825 { 826 if (domain->isEmpty()) 827 { 828 startFaces[0] = 0 ; 829 countFaces[0] = 0 ; 830 startNodes[0] = 0; 831 countNodes[0] = 0; 832 startEdges[0] = 0; 833 countEdges[0] = 0; 834 startEdgeFaces[0] = 0; 835 startEdgeFaces[1] = 0; 836 countEdgeFaces[0] = 0; 837 countEdgeFaces[1] = 0; 838 startFaceConctv[0] = 0; 839 startFaceConctv[1] = 0; 840 countFaceConctv[0] = 0; 841 countFaceConctv[1] = 0; 842 } 843 else 844 { 845 startFaces[0] = domain->zoom_ibegin-domain->global_zoom_ibegin; 846 countFaces[0] = domain->zoom_ni ; 847 startNodes[0] = domain->mesh->node_start; 848 countNodes[0] = domain->mesh->node_count; 849 startEdges[0] = domain->mesh->edge_start; 850 countEdges[0] = domain->mesh->edge_count; 851 startEdgeNodes[0] = domain->mesh->edge_start; 852 startEdgeNodes[1] = 0; 853 countEdgeNodes[0] = domain->mesh->edge_count; 854 countEdgeNodes[1]= 2; 855 startEdgeFaces[0] = domain->mesh->edge_start; 856 startEdgeFaces[1]= 0; 857 countEdgeFaces[0] = domain->mesh->edge_count; 858 countEdgeFaces[1]= 2; 859 startFaceConctv[0] = domain->zoom_ibegin-domain->global_zoom_ibegin; 860 startFaceConctv[1] = 0; 861 countFaceConctv[0] = domain->zoom_ni; 862 countFaceConctv[1] = domain->nvertex; 863 } 864 SuperClassWriter::writeData(domain->mesh->node_lat, node_y, isCollective, 0, &startNodes, &countNodes); 865 SuperClassWriter::writeData(domain->mesh->node_lon, node_x, isCollective, 0, &startNodes, &countNodes); 866 SuperClassWriter::writeData(domain->mesh->edge_lat, edge_y, isCollective, 0, &startEdges, &countEdges); 867 SuperClassWriter::writeData(domain->mesh->edge_lon, edge_x, isCollective, 0, &startEdges, &countEdges); 868 SuperClassWriter::writeData(domain->mesh->edge_nodes, edge_nodes, isCollective, 0, &startEdgeNodes, &countEdgeNodes); 869 SuperClassWriter::writeData(domain->mesh->face_lat, face_y, isCollective, 0, &startFaces, &countFaces); 870 SuperClassWriter::writeData(domain->mesh->face_lon, face_x, isCollective, 0, &startFaces, &countFaces); 871 SuperClassWriter::writeData(domain->mesh->face_nodes, face_nodes, isCollective, 0, &startFaceConctv, &countFaceConctv); 872 SuperClassWriter::writeData(domain->mesh->face_edges, face_edges, isCollective, 0, &startFaceConctv, &countFaceConctv); 873 SuperClassWriter::writeData(domain->mesh->edge_faces, edge_faces, isCollective, 0, &startEdgeFaces, &countEdgeFaces); 874 SuperClassWriter::writeData(domain->mesh->face_faces, face_faces, isCollective, 0, &startFaceConctv, &countFaceConctv); 875 } 876 setWrittenDomain(domid); 877 } // !isWrittenDomain 781 if (domain->isEmpty()) 782 { 783 startNodes[0]=0 ; 784 countNodes[0]=0 ; 785 } 786 else 787 { 788 startNodes[0] = domain->zoom_ibegin-domain->global_zoom_ibegin; 789 countNodes[0] = domain->zoom_ni ; 790 } 791 792 SuperClassWriter::writeData(domain->mesh->node_lat, node_y, isCollective, 0, &startNodes, &countNodes); 793 SuperClassWriter::writeData(domain->mesh->node_lon, node_x, isCollective, 0, &startNodes, &countNodes); 794 } 795 else if (domain->nvertex == 2) 796 { 797 if (domain->isEmpty()) 798 { 799 startEdges[0]=0 ; 800 countEdges[0]=0 ; 801 startNodes[0]=0 ; 802 countNodes[0]=0 ; 803 startEdgeNodes[0]=0; 804 startEdgeNodes[1]=0; 805 countEdgeNodes[0]=0; 806 countEdgeNodes[1]=0; 807 808 } 809 else 810 { 811 startEdges[0] = domain->zoom_ibegin-domain->global_zoom_ibegin; 812 countEdges[0] = domain->zoom_ni; 813 startNodes[0] = domain->mesh->node_start; 814 countNodes[0] = domain->mesh->node_count; 815 startEdgeNodes[0] = domain->zoom_ibegin-domain->global_zoom_ibegin; 816 startEdgeNodes[1] = 0; 817 countEdgeNodes[0] = domain->zoom_ni; 818 countEdgeNodes[1] = 2; 819 } 820 SuperClassWriter::writeData(domain->mesh->node_lat, node_y, isCollective, 0, &startNodes, &countNodes); 821 SuperClassWriter::writeData(domain->mesh->node_lon, node_x, isCollective, 0, &startNodes, &countNodes); 822 SuperClassWriter::writeData(domain->mesh->edge_lat, edge_y, isCollective, 0, &startEdges, &countEdges); 823 SuperClassWriter::writeData(domain->mesh->edge_lon, edge_x, isCollective, 0, &startEdges, &countEdges); 824 SuperClassWriter::writeData(domain->mesh->edge_nodes, edge_nodes, isCollective, 0, &startEdgeNodes, &countEdgeNodes); 825 } 878 826 else 879 827 { 880 if (domain->nvertex == 2) 881 { 882 startEdges[0] = domain->zoom_ibegin-domain->global_zoom_ibegin; 883 countEdges[0] = domain->zoom_ni; 884 startEdgeNodes[0] = domain->zoom_ibegin-domain->global_zoom_ibegin; 885 startEdgeNodes[1] = 0; 886 countEdgeNodes[0] = domain->zoom_ni; 887 countEdgeNodes[1]= 2; 888 SuperClassWriter::writeData(domain->mesh->edge_lat, edge_y, isCollective, 0, &startEdges, &countEdges); 889 SuperClassWriter::writeData(domain->mesh->edge_lon, edge_x, isCollective, 0, &startEdges, &countEdges); 890 SuperClassWriter::writeData(domain->mesh->edge_nodes, edge_nodes, isCollective, 0, &startEdgeNodes, &countEdgeNodes); 891 } 892 if (domain->nvertex > 2) 893 { 894 895 if (!domain->mesh->edgesAreWritten) 896 { 897 startEdges[0] = domain->mesh->edge_start; 898 countEdges[0] = domain->mesh->edge_count; 899 startEdgeNodes[0] = domain->mesh->edge_start; 900 startEdgeNodes[1] = 0; 901 countEdgeNodes[0] = domain->mesh->edge_count; 902 countEdgeNodes[1]= 2; 903 SuperClassWriter::writeData(domain->mesh->edge_lat, edge_y, isCollective, 0, &startEdges, &countEdges); 904 SuperClassWriter::writeData(domain->mesh->edge_lon, edge_x, isCollective, 0, &startEdges, &countEdges); 905 SuperClassWriter::writeData(domain->mesh->edge_nodes, edge_nodes, isCollective, 0, &startEdgeNodes, &countEdgeNodes); 906 } 907 startFaces[0] = domain->zoom_ibegin-domain->global_zoom_ibegin; 908 countFaces[0] = domain->zoom_ni; 909 startEdgeFaces[0] = domain->mesh->edge_start; 910 startEdgeFaces[1]= 0; 911 countEdgeFaces[0] = domain->mesh->edge_count; 912 countEdgeFaces[1]= 2; 913 startFaceConctv[0] = domain->zoom_ibegin-domain->global_zoom_ibegin; 914 startFaceConctv[1] = 0; 915 countFaceConctv[0] = domain->zoom_ni; 916 countFaceConctv[1] = domain->nvertex; 917 SuperClassWriter::writeData(domain->mesh->face_lat, face_y, isCollective, 0, &startFaces, &countFaces); 918 SuperClassWriter::writeData(domain->mesh->face_lon, face_x, isCollective, 0, &startFaces, &countFaces); 919 SuperClassWriter::writeData(domain->mesh->face_nodes, face_nodes, isCollective, 0, &startFaceConctv, &countFaceConctv); 920 SuperClassWriter::writeData(domain->mesh->face_edges, face_edges, isCollective, 0, &startFaceConctv, &countFaceConctv); 921 SuperClassWriter::writeData(domain->mesh->edge_faces, edge_faces, isCollective, 0, &startEdgeFaces, &countEdgeFaces); 922 SuperClassWriter::writeData(domain->mesh->face_faces, face_faces, isCollective, 0, &startFaceConctv, &countFaceConctv); 923 } 924 }// isWrittenDomain 925 828 if (domain->isEmpty()) 829 { 830 startFaces[0] = 0 ; 831 countFaces[0] = 0 ; 832 startNodes[0] = 0; 833 countNodes[0] = 0; 834 startEdges[0] = 0; 835 countEdges[0] = 0; 836 startEdgeFaces[0] = 0; 837 startEdgeFaces[1] = 0; 838 countEdgeFaces[0] = 0; 839 countEdgeFaces[1] = 0; 840 startFaceConctv[0] = 0; 841 startFaceConctv[1] = 0; 842 countFaceConctv[0] = 0; 843 countFaceConctv[1] = 0; 844 } 845 else 846 { 847 startFaces[0] = domain->zoom_ibegin-domain->global_zoom_ibegin; 848 countFaces[0] = domain->zoom_ni ; 849 startNodes[0] = domain->mesh->node_start; 850 countNodes[0] = domain->mesh->node_count; 851 startEdges[0] = domain->mesh->edge_start; 852 countEdges[0] = domain->mesh->edge_count; 853 startEdgeNodes[0] = domain->mesh->edge_start; 854 startEdgeNodes[1] = 0; 855 countEdgeNodes[0] = domain->mesh->edge_count; 856 countEdgeNodes[1]= 2; 857 startEdgeFaces[0] = domain->mesh->edge_start; 858 startEdgeFaces[1]= 0; 859 countEdgeFaces[0] = domain->mesh->edge_count; 860 countEdgeFaces[1]= 2; 861 startFaceConctv[0] = domain->zoom_ibegin-domain->global_zoom_ibegin; 862 startFaceConctv[1] = 0; 863 countFaceConctv[0] = domain->zoom_ni; 864 countFaceConctv[1] = domain->nvertex; 865 } 866 SuperClassWriter::writeData(domain->mesh->node_lat, node_y, isCollective, 0, &startNodes, &countNodes); 867 SuperClassWriter::writeData(domain->mesh->node_lon, node_x, isCollective, 0, &startNodes, &countNodes); 868 SuperClassWriter::writeData(domain->mesh->edge_lat, edge_y, isCollective, 0, &startEdges, &countEdges); 869 SuperClassWriter::writeData(domain->mesh->edge_lon, edge_x, isCollective, 0, &startEdges, &countEdges); 870 SuperClassWriter::writeData(domain->mesh->edge_nodes, edge_nodes, isCollective, 0, &startEdgeNodes, &countEdgeNodes); 871 SuperClassWriter::writeData(domain->mesh->face_lat, face_y, isCollective, 0, &startFaces, &countFaces); 872 SuperClassWriter::writeData(domain->mesh->face_lon, face_x, isCollective, 0, &startFaces, &countFaces); 873 SuperClassWriter::writeData(domain->mesh->face_nodes, face_nodes, isCollective, 0, &startFaceConctv, &countFaceConctv); 874 SuperClassWriter::writeData(domain->mesh->face_edges, face_edges, isCollective, 0, &startFaceConctv, &countFaceConctv); 875 SuperClassWriter::writeData(domain->mesh->edge_faces, edge_faces, isCollective, 0, &startEdgeFaces, &countEdgeFaces); 876 SuperClassWriter::writeData(domain->mesh->face_faces, face_faces, isCollective, 0, &startFaceConctv, &countFaceConctv); 877 } 926 878 SuperClassWriter::definition_start(); 927 879 -
XIOS/dev/XIOS_DEV_CMIP6/src/node/file.cpp
r1486 r1494 549 549 data_out->writeFile(CFile::get(this)); 550 550 551 if (!useCFConvention) sortEnabledFieldsForUgrid(); 552 551 553 // Do not recreate the file structure if opening an existing file 552 554 if (!data_out->IsInAppendMode()) … … 809 811 } 810 812 813 /*! 814 \brief Sorting domains with the same name (= describing the same mesh) in the decreasing order of nvertex for UGRID files. 815 This insures that the domain with the highest nvertex is written first and thus all known mesh connectivity is generated at once by this domain. 816 */ 817 void CFile::sortEnabledFieldsForUgrid() 818 { 819 int size = this->enabledFields.size(); 820 std::vector<int> domainNvertices; 821 std::vector<StdString> domainNames; 822 823 for (int i = 0; i < size; ++i) 824 { 825 std::vector<CDomain*> domain = this->enabledFields[i]->getRelGrid()->getDomains(); 826 if (domain.size() != 1) 827 { 828 ERROR("void CFile::sortEnabledFieldsForUgrid()", 829 "A domain, and only one, should be defined for grid "<< this->enabledFields[i]->getRelGrid()->getId() << "."); 830 } 831 StdString domainName = domain[0]->getDomainOutputName(); 832 int nvertex; 833 if (domain[0]->nvertex.isEmpty()) 834 { 835 ERROR("void CFile::sortEnabledFieldsForUgrid()", 836 "Attributes nvertex must be defined for domain "<< domain[0]->getDomainOutputName() << "."); 837 } 838 else 839 nvertex = domain[0]->nvertex; 840 841 for (int j = 0; j < i; ++j) 842 { 843 if (domainName == domainNames[j] && nvertex > domainNvertices[j]) 844 { 845 CField* tmpSwap = this->enabledFields[j]; 846 this->enabledFields[j] = this->enabledFields[i]; 847 this->enabledFields[i] = tmpSwap; 848 domainNames.push_back(domainNames[j]); 849 domainNames[j] = domainName; 850 domainNvertices.push_back(domainNvertices[j]); 851 domainNvertices[j] = nvertex; 852 } 853 else 854 { 855 domainNames.push_back(domainName); 856 domainNvertices.push_back(nvertex); 857 } 858 } 859 if (i==0) 860 { 861 domainNames.push_back(domainName); 862 domainNvertices.push_back(nvertex); 863 } 864 } 865 } 866 811 867 void CFile::sendGridOfEnabledFields() 812 868 { -
XIOS/dev/XIOS_DEV_CMIP6/src/node/file.hpp
r1358 r1494 118 118 void checkGridOfEnabledFields(); 119 119 void sendGridOfEnabledFields(); 120 void sendGridComponentOfEnabledFields(); 120 void sendGridComponentOfEnabledFields(); 121 122 void sortEnabledFieldsForUgrid(); 121 123 122 124 // Add component into file
Note: See TracChangeset
for help on using the changeset viewer.