void myRunInC(ESMC_GridComp gcomp, ESMC_State importState, ESMC_State exportState, ESMC_Clock *clock, int *rc){ // local data ESMC_Array retrievedArray; int localrc; printf("I am in myRunInC()\n"); localrc=ESMC_StateGetArray(exportState, "array1", &retrievedArray); double *ptr = (double *)ESMC_ArrayGetPtr(retrievedArray, 0, &localrc); // verify data values for (int j=0; j<2; j++){ for (int i=0; i<5; i++){ int ij= j*5 +i; if ( fabs(ptr[ij]-float((j+1)*10+i+1)) > 1.e-8 ){ printf("ptr has wrong values at i=%d,j=%d,ij=%d\n", i,j,ij); *rc = ESMC_Finalize(); } } } printf("Data values in exp state correct in myRunInC\n"); // return successfully if (rc!=NULL) *rc = ESMF_SUCCESS; }
void myInitInC(ESMC_GridComp gcomp, ESMC_State importState, ESMC_State exportState, ESMC_Clock *clock, int *rc){ int localrc; ESMC_Array retrievedArray; printf("I am in myInitInC()\n"); localrc=ESMC_StateGetArray(exportState, "array1", &retrievedArray); double *ptr = (double *)ESMC_ArrayGetPtr(retrievedArray, 0, &localrc); printf("local ptr[0] = %g\n", ptr[0]); printf("local ptr[1] = %g\n", ptr[1]); for (int j=0; j<2; j++){ for (int i=0; i<5; i++){ int ij= j*5 +i; ptr[ij] = j; } } printf("local ptr[0] = %g\n", ptr[0]); printf("Reset farray values to farray(i,j)=j \n"); printf("Leaving myInitInC()\n"); // return successfully if (rc!=NULL) *rc = ESMF_SUCCESS; }
void myRunInC(ESMC_GridComp gcomp, ESMC_State importState, ESMC_State exportState, ESMC_Clock *clock, int *rc){ ESMC_Array retrievedArray; double *ptr; int i, j, ij; // initialize return code *rc = ESMF_SUCCESS; printf("In myRunInC()\n"); // get Array from import State *rc=ESMC_StateGetArray(importState, "array1", &retrievedArray); if (*rc!=ESMF_SUCCESS) return; // bail out // obtain access to Array data ptr = (double *)ESMC_ArrayGetPtr(retrievedArray, 0, rc); if (*rc!=ESMF_SUCCESS) return; // bail out // verify data values for (j=0; j<2; j++){ for (i=0; i<5; i++){ ij= j*5 +i; if ( fabs(ptr[ij]-float((j+1)*10+i+1)) > 1.e-8 ){ printf("Array has wrong values at i=%d, j=%d, ij=%d\n", i, j, ij); *rc = ESMF_FAILURE; // indicate failure in return code return; // bail out } } } }
void myInitInC(ESMC_GridComp gcomp, ESMC_State importState, ESMC_State exportState, ESMC_Clock *clock, int *rc){ // Array variables ESMC_Array retrievedArray; double *ptr; int i, j, ij; // Mesh variables ESMC_Mesh mesh; int pdim=2; int sdim=3; int num_elem, num_node, conn_size; int *nodeId, *nodeOwner; double *nodeCoord; int *elemId, *elemType, *elemConn; // Field variables ESMC_Field field; ESMC_ArraySpec arrayspec; int *gridToFieldMap, *ungriddedLBound, *ungriddedUBound; ESMC_InterfaceInt i_gridToFieldMap, i_ungriddedLBound, i_ungriddedUBound; // initialize return code *rc = ESMF_SUCCESS; printf("In myInitInC()\n"); // get Array from import State *rc=ESMC_StateGetArray(importState, "array1", &retrievedArray); if (*rc!=ESMF_SUCCESS) return; // bail out // obtain access to Array data ptr = (double *)ESMC_ArrayGetPtr(retrievedArray, 0, rc); if (*rc!=ESMF_SUCCESS) return; // bail out // test accesibility of Array data via print printf("local ptr[0] = %g\n", ptr[0]); printf("local ptr[1] = %g\n", ptr[1]); // modify Array data for (j=0; j<2; j++){ for (i=0; i<5; i++){ // interpret as 2D array with contiguous, column-major storage ij= j*5 +i; ptr[ij] = j; } } // print a modified value printf("local ptr[0] = %g\n", ptr[0]); // Create a Mesh from VTK file mesh = ESMC_MeshCreate(&pdim, &sdim, rc); if (*rc!=ESMF_SUCCESS) return; // bail out // Read input files' header data *rc = ESMC_MeshVTKHeader("data/testmesh", &num_elem, &num_node, &conn_size); if (*rc!=ESMF_SUCCESS) return; // bail out // Allocate the arrays to describe Mesh nodeId = (int *) malloc (num_node * sizeof (int)); nodeCoord = (double *) malloc (3*num_node * sizeof (double)); nodeOwner = (int *) malloc (num_node * sizeof (int)); elemId = (int *) malloc (num_elem * sizeof (int)); elemType = (int *) malloc (num_elem * sizeof (int)); elemConn = (int *) malloc (conn_size * sizeof (int)); // Read input files *rc = ESMC_MeshVTKBody("data/testmesh", nodeId, nodeCoord, nodeOwner, elemId, elemType, elemConn); if (*rc!=ESMF_SUCCESS) return; // bail out // VTKBody returns zero based elemConn, so make them 1 based for (int i = 0; i < conn_size; i++){ elemConn[i] = elemConn[i]+1; } // Add node information to the mesh *rc = ESMC_MeshAddNodes(mesh, &num_node, nodeId, nodeCoord, nodeOwner); if (*rc!=ESMF_SUCCESS) return; // bail out // Add element information to the mesh *rc = ESMC_MeshAddElements(mesh, &num_elem, elemId, elemType, elemConn); if (*rc!=ESMF_SUCCESS) return; // bail out // garbage collection of temporary variables used to create Mesh object free(nodeId); free(nodeCoord); free(nodeOwner); free(elemId); free(elemType); free(elemConn); // Create a Field from Mesh // Setup arrayspec *rc = ESMC_ArraySpecSet(&arrayspec, 3, ESMC_TYPEKIND_I4); if (*rc!=ESMF_SUCCESS) return; // bail out // Setup gridToFieldMap gridToFieldMap = (int *)malloc(sizeof(int)); gridToFieldMap[0] = 1; i_gridToFieldMap = ESMC_InterfaceIntCreate(gridToFieldMap, 1, rc); if (*rc!=ESMF_SUCCESS) return; // bail out // Setup ungriddedLBound ungriddedLBound = (int *)malloc(2*sizeof(int)); ungriddedLBound[0] = 1; ungriddedLBound[1] = 1; i_ungriddedLBound = ESMC_InterfaceIntCreate(ungriddedLBound, 2, rc); if (*rc!=ESMF_SUCCESS) return; // bail out // Setup ungriddedUBound ungriddedUBound = (int *)malloc(2*sizeof(int)); ungriddedUBound[0] = 2; ungriddedUBound[1] = 3; i_ungriddedUBound = ESMC_InterfaceIntCreate(ungriddedUBound, 2, rc); if (*rc!=ESMF_SUCCESS) return; // bail out // Finally create Field field = ESMC_FieldCreate(mesh, arrayspec, i_gridToFieldMap, i_ungriddedLBound, i_ungriddedUBound, "Field from C", rc); if (*rc!=ESMF_SUCCESS) return; // bail out // Add Field to the export State *rc = ESMC_StateAddField(exportState, field); if (*rc!=ESMF_SUCCESS) return; // bail out // garbage collection of temporary variables used to create Field object *rc = ESMC_InterfaceIntDestroy(&i_gridToFieldMap); if (*rc!=ESMF_SUCCESS) return; // bail out free(gridToFieldMap); *rc = ESMC_InterfaceIntDestroy(&i_ungriddedLBound); if (*rc!=ESMF_SUCCESS) return; // bail out free(ungriddedLBound); *rc = ESMC_InterfaceIntDestroy(&i_ungriddedUBound); if (*rc!=ESMF_SUCCESS) return; // bail out free(ungriddedUBound); }