34 integer(I4B) :: nmesh_node
35 integer(I4B) :: nmesh_face
36 integer(I4B) :: max_nmesh_face_nodes
46 integer(I4B) :: mesh_node_x
47 integer(I4B) :: mesh_node_y
48 integer(I4B) :: mesh_face_x
49 integer(I4B) :: mesh_face_y
50 integer(I4B) :: mesh_face_xbnds
51 integer(I4B) :: mesh_face_ybnds
52 integer(I4B) :: mesh_face_nodes
54 integer(I4B),
dimension(:),
allocatable :: dependent
64 integer(I4B),
pointer :: chunk_face
82 character(len=*),
intent(in) :: pkgtype
83 character(len=*),
intent(in) :: pkgname
84 character(len=*),
intent(in) :: mempath
98 subroutine mesh_init(this, modelname, modeltype, modelfname, nc_fname, &
99 disenum, nctype, iout)
102 character(len=*),
intent(in) :: modelname
103 character(len=*),
intent(in) :: modeltype
104 character(len=*),
intent(in) :: modelfname
105 character(len=*),
intent(in) :: nc_fname
106 integer(I4B),
intent(in) :: disenum
107 integer(I4B),
intent(in) :: nctype
108 integer(I4B),
intent(in) :: iout
109 logical(LGP) :: found
112 call this%NCModelExportType%init(modelname, modeltype, modelfname, nc_fname, &
113 disenum, nctype, iout)
116 allocate (this%chunk_face)
120 if (this%ncf_mempath /=
'')
then
121 call mem_set_value(this%chunk_face,
'CHUNK_FACE', this%ncf_mempath, found)
124 if (this%chunk_time > 0 .and. this%chunk_face > 0)
then
125 this%chunking_active = .true.
126 else if (this%chunk_time > 0 .or. this%chunk_face > 0)
then
129 write (
warnmsg,
'(a)')
'Ignoring user provided NetCDF chunking parameter. &
130 &Define chunk_time and chunk_face input parameters to see an effect.'
135 call nf_verify(nf90_create(this%nc_fname, &
136 ior(nf90_clobber, nf90_netcdf4), this%ncid), &
145 call nf_verify(nf90_close(this%ncid), this%nc_fname)
146 deallocate (this%chunk_face)
147 nullify (this%chunk_face)
155 call nf_verify(nf90_put_att(this%ncid, nf90_global,
'title', &
156 this%annotation%title), this%nc_fname)
158 call nf_verify(nf90_put_att(this%ncid, nf90_global,
'source', &
159 this%annotation%source), this%nc_fname)
161 call nf_verify(nf90_put_att(this%ncid, nf90_global,
'modflow6_grid', &
162 this%annotation%grid), this%nc_fname)
164 call nf_verify(nf90_put_att(this%ncid, nf90_global,
'modflow6_model', &
165 this%annotation%model), this%nc_fname)
167 call nf_verify(nf90_put_att(this%ncid, nf90_global,
'history', &
168 this%annotation%history), this%nc_fname)
170 call nf_verify(nf90_put_att(this%ncid, nf90_global,
'Conventions', &
171 this%annotation%conventions), &
180 character(len=*),
intent(in) :: pkgtype
181 character(len=*),
intent(in) :: pkgname
182 character(len=*),
intent(in) :: mempath
184 intent(in) :: param_dfns
186 integer(I4B) :: iparam, isize
188 do iparam = 1,
size(param_dfns)
190 idt => param_dfns(iparam)
192 if (idt%blockname ==
'GRIDDATA')
then
194 call get_isize(idt%mf6varname, mempath, isize)
196 call this%export_input_array(pkgtype, pkgname, mempath, idt)
212 character(LENCOMPONENTNAME) :: ptype, pname, pkgtype
213 character(len=LENMEMPATH) :: input_mempath
215 pointer :: pkgtypes => null()
217 pointer :: pkgnames => null()
219 pointer :: mempaths => null()
221 character(len=LENMEMPATH) :: mempath
223 integer(I4B),
pointer :: export_arrays
224 logical(LGP) :: found
229 call mem_setptr(pkgtypes,
'PKGTYPES', input_mempath)
230 call mem_setptr(pkgnames,
'PKGNAMES', input_mempath)
231 call mem_setptr(mempaths,
'MEMPATHS', input_mempath)
233 allocate (export_arrays)
235 do n = 1,
size(mempaths)
240 mempath = mempaths(n)
245 if (mempath /=
'')
then
247 call mem_set_value(export_arrays,
'EXPORT_NC', mempath, found)
248 if (export_arrays > 0)
then
250 param_dfns => param_definitions(this%modeltype, pkgtype)
251 call this%export_input_arrays(ptype, pname, mempath, param_dfns)
257 deallocate (export_arrays)
264 character(len=LINELENGTH) :: varname, longname
274 write (varname,
'(a,i0)') trim(this%xname)//
'_l', k
275 write (longname,
'(a,i0,a)') trim(this%annotation%longname)// &
279 call nf_verify(nf90_def_var(this%ncid, varname, nf90_double, &
280 (/this%dim_ids%nmesh_face, &
281 this%dim_ids%time/), &
282 this%var_ids%dependent(k)), &
286 if (this%chunking_active)
then
287 call nf_verify(nf90_def_var_chunking(this%ncid, &
288 this%var_ids%dependent(k), &
291 this%chunk_time/)), &
296 call ncvar_deflate(this%ncid, this%var_ids%dependent(k), this%deflate, &
297 this%shuffle, this%nc_fname)
300 call nf_verify(nf90_put_att(this%ncid, this%var_ids%dependent(k), &
301 'units',
'm'), this%nc_fname)
302 call nf_verify(nf90_put_att(this%ncid, this%var_ids%dependent(k), &
303 'standard_name', this%annotation%stdname), &
305 call nf_verify(nf90_put_att(this%ncid, this%var_ids%dependent(k), &
306 'long_name', longname), this%nc_fname)
307 call nf_verify(nf90_put_att(this%ncid, this%var_ids%dependent(k), &
310 call nf_verify(nf90_put_att(this%ncid, this%var_ids%dependent(k), &
311 'mesh', this%mesh_name), this%nc_fname)
312 call nf_verify(nf90_put_att(this%ncid, this%var_ids%dependent(k), &
313 'location',
'face'), this%nc_fname)
317 this%gridmap_name, this%nc_fname)
325 integer(I4B) :: var_id
328 if (this%wkt /=
'')
then
330 call nf_verify(nf90_redef(this%ncid), this%nc_fname)
331 call nf_verify(nf90_def_var(this%ncid, this%gridmap_name, nf90_int, &
332 var_id), this%nc_fname)
337 call nf_verify(nf90_put_att(this%ncid, var_id,
'wkt', this%wkt), &
339 call nf_verify(nf90_enddef(this%ncid), this%nc_fname)
340 call nf_verify(nf90_put_var(this%ncid, var_id, 1), &
351 call nf_verify(nf90_def_var(this%ncid, this%mesh_name, nf90_int, &
352 this%var_ids%mesh), this%nc_fname)
355 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh,
'cf_role', &
356 'mesh_topology'), this%nc_fname)
357 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh,
'long_name', &
358 '2D mesh topology'), this%nc_fname)
359 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh, &
360 'topology_dimension', 2), this%nc_fname)
361 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh,
'face_dimension', &
362 'nmesh_face'), this%nc_fname)
363 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh, &
364 'node_coordinates',
'mesh_node_x mesh_node_y'), &
366 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh, &
367 'face_coordinates',
'mesh_face_x mesh_face_y'), &
369 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh, &
370 'face_node_connectivity',
'mesh_face_nodes'), &
374 call nf_verify(nf90_def_var(this%ncid,
'mesh_node_x', nf90_double, &
375 (/this%dim_ids%nmesh_node/), &
376 this%var_ids%mesh_node_x), this%nc_fname)
379 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_x, &
380 'units',
'm'), this%nc_fname)
381 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_x, &
382 'standard_name',
'projection_x_coordinate'), &
384 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_x, &
385 'long_name',
'Easting'), this%nc_fname)
387 if (this%wkt /=
'')
then
389 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_x, &
390 'grid_mapping', this%gridmap_name), &
395 call nf_verify(nf90_def_var(this%ncid,
'mesh_node_y', nf90_double, &
396 (/this%dim_ids%nmesh_node/), &
397 this%var_ids%mesh_node_y), this%nc_fname)
400 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_y, &
401 'units',
'm'), this%nc_fname)
402 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_y, &
403 'standard_name',
'projection_y_coordinate'), &
405 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_y, &
406 'long_name',
'Northing'), this%nc_fname)
408 if (this%wkt /=
'')
then
410 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_node_y, &
411 'grid_mapping', this%gridmap_name), &
416 call nf_verify(nf90_def_var(this%ncid,
'mesh_face_x', nf90_double, &
417 (/this%dim_ids%nmesh_face/), &
418 this%var_ids%mesh_face_x), this%nc_fname)
421 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_x, &
422 'units',
'm'), this%nc_fname)
423 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_x, &
424 'standard_name',
'projection_x_coordinate'), &
426 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_x, &
427 'long_name',
'Easting'), this%nc_fname)
428 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_x,
'bounds', &
429 'mesh_face_xbnds'), this%nc_fname)
430 if (this%wkt /=
'')
then
432 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_x, &
433 'grid_mapping', this%gridmap_name), &
438 call nf_verify(nf90_def_var(this%ncid,
'mesh_face_xbnds', nf90_double, &
439 (/this%dim_ids%max_nmesh_face_nodes, &
440 this%dim_ids%nmesh_face/), &
441 this%var_ids%mesh_face_xbnds), &
445 call nf_verify(nf90_def_var(this%ncid,
'mesh_face_y', nf90_double, &
446 (/this%dim_ids%nmesh_face/), &
447 this%var_ids%mesh_face_y), this%nc_fname)
450 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_y, &
451 'units',
'm'), this%nc_fname)
452 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_y, &
453 'standard_name',
'projection_y_coordinate'), &
455 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_y, &
456 'long_name',
'Northing'), this%nc_fname)
457 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_y,
'bounds', &
458 'mesh_face_ybnds'), this%nc_fname)
460 if (this%wkt /=
'')
then
462 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_y, &
463 'grid_mapping', this%gridmap_name), &
468 call nf_verify(nf90_def_var(this%ncid,
'mesh_face_ybnds', nf90_double, &
469 (/this%dim_ids%max_nmesh_face_nodes, &
470 this%dim_ids%nmesh_face/), &
471 this%var_ids%mesh_face_ybnds), &
475 call nf_verify(nf90_def_var(this%ncid,
'mesh_face_nodes', nf90_int, &
476 (/this%dim_ids%max_nmesh_face_nodes, &
477 this%dim_ids%nmesh_face/), &
478 this%var_ids%mesh_face_nodes), &
482 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_nodes, &
483 'cf_role',
'face_node_connectivity'), &
485 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_nodes, &
487 'Vertices bounding cell (counterclockwise)'), &
489 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_nodes, &
490 '_FillValue', (/nf90_fill_int/)), &
492 call nf_verify(nf90_put_att(this%ncid, this%var_ids%mesh_face_nodes, &
493 'start_index', 1), this%nc_fname)
499 integer(I4B),
intent(in) :: ncid
500 integer(I4B),
intent(in) :: varid
501 integer(I4B),
intent(in) :: chunk_face
502 character(len=*),
intent(in) :: nc_fname
503 if (chunk_face > 0)
then
504 call nf_verify(nf90_def_var_chunking(ncid, varid, nf90_chunked, &
505 (/chunk_face/)), nc_fname)
512 integer(I4B),
intent(in) :: ncid
513 integer(I4B),
intent(in) :: varid
514 integer(I4B),
intent(in) :: deflate
515 integer(I4B),
intent(in) :: shuffle
516 character(len=*),
intent(in) :: nc_fname
517 if (deflate >= 0)
then
518 call nf_verify(nf90_def_var_deflate(ncid, varid, shuffle=shuffle, &
519 deflate=1, deflate_level=deflate), &
527 integer(I4B),
intent(in) :: ncid
528 integer(I4B),
intent(in) :: varid
529 character(len=*),
intent(in) :: gridmap_name
530 character(len=*),
intent(in) :: nc_fname
531 if (gridmap_name /=
'')
then
532 call nf_verify(nf90_put_att(ncid, varid,
'coordinates', &
533 'mesh_face_x mesh_face_y'), nc_fname)
534 call nf_verify(nf90_put_att(ncid, varid,
'grid_mapping', &
535 gridmap_name), nc_fname)
542 integer(I4B),
intent(in) :: ncid
543 integer(I4B),
intent(in) :: varid
544 integer(I4B),
intent(in) :: layer
545 integer(I4B),
intent(in) :: iper
546 integer(I4B),
intent(in) :: iaux
547 character(len=*),
intent(in) :: nc_tag
548 character(len=*),
intent(in) :: nc_fname
549 if (nc_tag /=
'')
then
550 call nf_verify(nf90_put_att(ncid, varid,
'modflow6_input', &
553 call nf_verify(nf90_put_att(ncid, varid,
'modflow6_layer', &
557 call nf_verify(nf90_put_att(ncid, varid,
'modflow6_iper', &
561 call nf_verify(nf90_put_att(ncid, varid,
'modflow6_iaux', &
571 character(len=*),
intent(in) :: varname
572 integer(I4B),
optional,
intent(in) :: layer
573 integer(I4B),
optional,
intent(in) :: iper
574 integer(I4B),
optional,
intent(in) :: iaux
575 character(len=LINELENGTH) :: vname
577 if (varname /=
'')
then
580 if (
present(layer))
then
582 write (vname,
'(a,i0)') trim(vname)//
'_l', layer
585 if (
present(iper))
then
587 write (vname,
'(a,i0)') trim(vname)//
'_p', iper
590 if (
present(iaux))
then
592 write (vname,
'(a,i0)') trim(vname)//
'a', iaux
abstract interfaces for derived ugrid netcd export types
This module contains simulation constants.
integer(i4b), parameter linelength
maximum length of a standard line
integer(i4b), parameter lencomponentname
maximum length of a component name
real(dp), parameter dnodata
real no data constant
real(dp), parameter dhnoflo
real no flow constant
integer(i4b), parameter lenmempath
maximum length of the memory path
type(inputparamdefinitiontype) function, dimension(:), pointer, public param_definitions(component, subcomponent)
logical function, public idm_multi_package(component, subcomponent)
This module defines variable data types.
character(len=lenmempath) function create_mem_path(component, subcomponent, context)
returns the path to the memory object
subroutine, public get_isize(name, mem_path, isize)
@ brief Get the number of elements for this variable
This module contains the MeshModelModule.
subroutine define_gridmap(this)
create the file grid mapping container variable
character(len=linelength) function, public export_varname(varname, layer, iper, iaux)
build netcdf variable name
subroutine, public ncvar_gridmap(ncid, varid, gridmap_name, nc_fname)
put variable gridmap attributes
subroutine mesh_init(this, modelname, modeltype, modelfname, nc_fname, disenum, nctype, iout)
initialize
subroutine, public ncvar_chunk(ncid, varid, chunk_face, nc_fname)
define variable chunking
subroutine mesh_destroy(this)
initialize
subroutine add_global_att(this)
create file (group) attributes
subroutine add_pkg_data(this)
determine packages to write gridded input
subroutine export_input_arrays(this, pkgtype, pkgname, mempath, param_dfns)
write package gridded input data
subroutine define_dependent(this)
create the model layer dependent variables
subroutine, public ncvar_deflate(ncid, varid, deflate, shuffle, nc_fname)
define variable compression
subroutine, public ncvar_mf6attr(ncid, varid, layer, iper, iaux, nc_tag, nc_fname)
put variable internal attributes
subroutine create_mesh(this)
create the file mesh container variable
This module contains the NCModelExportModule.
This module contains the NetCDFCommonModule.
subroutine, public nf_verify(res, nc_fname)
error check a netcdf-fortran interface call
This module contains simulation methods.
subroutine, public store_warning(msg, substring)
Store warning message.
subroutine, public store_error(msg, terminate)
Store an error message.
subroutine, public store_error_filename(filename, terminate)
Store the erroring file name.
This module contains simulation variables.
character(len=maxcharlen) errmsg
error message string
character(len=linelength) idm_context
character(len=maxcharlen) warnmsg
warning message string
This module contains the SourceCommonModule.
character(len=lencomponentname) function, public idm_subcomponent_type(component, subcomponent)
component from package or model type
This class is used to store a single deferred-length character string. It was designed to work in an ...
base ugrid netcdf export type
type for storing model export dimension ids
type for storing model export variable ids
abstract type for model netcdf export type