void ICPhaseSatur( Vector *ic_phase_satur, int phase, ProblemData *problem_data) { PFModule *this_module = ThisPFModule; PublicXtra *public_xtra = (PublicXtra *)PFModulePublicXtra(this_module); Grid *grid = VectorGrid(ic_phase_satur); Type0 *dummy0; SubgridArray *subgrids = GridSubgrids(grid); Subgrid *subgrid; Subvector *ps_sub; double *data; int ix, iy, iz; int nx, ny, nz; int r; double field_sum; int is, i, j, k, ips; /*----------------------------------------------------------------------- * Initial saturation conditions for this phase *-----------------------------------------------------------------------*/ InitVector(ic_phase_satur, 0.0); switch((public_xtra -> type[phase])) { case 0: { int num_regions; int *region_indices; double *values; GrGeomSolid *gr_solid; double value; int ir; dummy0 = (Type0 *)(public_xtra -> data[phase]); num_regions = (dummy0 -> num_regions); region_indices = (dummy0 -> region_indices); values = (dummy0 -> values); for (ir = 0; ir < num_regions; ir++) { gr_solid = ProblemDataGrSolid(problem_data, region_indices[ir]); value = values[ir]; ForSubgridI(is, subgrids) { subgrid = SubgridArraySubgrid(subgrids, is); ps_sub = VectorSubvector(ic_phase_satur, is); ix = SubgridIX(subgrid); iy = SubgridIY(subgrid); iz = SubgridIZ(subgrid); nx = SubgridNX(subgrid); ny = SubgridNY(subgrid); nz = SubgridNZ(subgrid); /* RDF: assume resolution is the same in all 3 directions */ r = SubgridRX(subgrid); data = SubvectorData(ps_sub); GrGeomInLoop(i, j, k, gr_solid, r, ix, iy, iz, nx, ny, nz, { ips = SubvectorEltIndex(ps_sub, i, j, k); data[ips] = value; }); } } break; }
void XSlope( ProblemData *problem_data, Vector * x_slope, Vector * dummy) { PFModule *this_module = ThisPFModule; PublicXtra *public_xtra = (PublicXtra*)PFModulePublicXtra(this_module); InstanceXtra *instance_xtra = (InstanceXtra*)PFModuleInstanceXtra(this_module); Grid *grid3d = instance_xtra->grid3d; GrGeomSolid *gr_solid, *gr_domain; Type0 *dummy0; Type1 *dummy1; Type2 *dummy2; Type3 *dummy3; VectorUpdateCommHandle *handle; SubgridArray *subgrids = GridSubgrids(grid3d); Subgrid *subgrid; Subvector *ps_sub; Subvector *sx_values_sub; double *data; double *psdat, *sx_values_dat; //double slopex[60][32][392]; int ix, iy, iz; int nx, ny, nz; int r; int is, i, j, k, ips, ipicv; double time = 0.0; (void)dummy; /*----------------------------------------------------------------------- * Put in any user defined sources for this phase *-----------------------------------------------------------------------*/ InitVectorAll(x_slope, 0.0); switch ((public_xtra->type)) { case 0: { int num_regions; int *region_indices; double *values; double x, y, z; double value; int ir; dummy0 = (Type0*)(public_xtra->data); num_regions = (dummy0->num_regions); region_indices = (dummy0->region_indices); values = (dummy0->values); for (ir = 0; ir < num_regions; ir++) { gr_solid = ProblemDataGrSolid(problem_data, region_indices[ir]); value = values[ir]; ForSubgridI(is, subgrids) { subgrid = SubgridArraySubgrid(subgrids, is); ps_sub = VectorSubvector(x_slope, is); ix = SubgridIX(subgrid); iy = SubgridIY(subgrid); iz = SubgridIZ(subgrid); nx = SubgridNX(subgrid); ny = SubgridNY(subgrid); nz = SubgridNZ(subgrid); /* RDF: assume resolution is the same in all 3 directions */ r = SubgridRX(subgrid); /* * TODO * SGS this does not match the loop in nl_function_eval. That * loop is going over more than the inner geom locations. Is that * important? Originally the x_slope array was not being allocated * by ctalloc, just alloc and unitialized memory reads were being * caused. Switched that to be ctalloc to init to 0 to "hack" a * fix but is this really a sign of deeper indexing problems? */ /* @RMM: todo. the looping to set slopes only goes over interior nodes * not ALL nodes (including ghost) as in nl fn eval and now the overland eval * routines. THis is fine in the KW approximation which only needs interior values * but for diffusive wave and for the terrain following grid (which uses the surface * topo slopes as subsurface slopes) this can cuase bddy problems. */ data = SubvectorData(ps_sub); GrGeomInLoop(i, j, k, gr_solid, r, ix, iy, iz, nx, ny, nz, { ips = SubvectorEltIndex(ps_sub, i, j, 0); x = RealSpaceX(i, SubgridRX(subgrid)); //data[ips] = sin(x)/8.0 + (1/8)*pow(x,-(7/8)) +sin(x/5.0)/(5.0*8.0); data[ips] = value; }); } } break; } /* End case 0 */