56 character(len=LENMEMPATH) :: virt_mem_path, local_mem_path
61 if (.not. vx%v_model1%is_local)
then
62 virt_mem_path = vx%get_vrt_mem_path(
'NODEM1',
'')
63 call this%map_data_full(0,
'NODEM1', conn%prim_exchange%memoryPath, &
69 virt_mem_path = vx%get_vrt_mem_path(
'QPACTUAL_M1',
'MVR')
70 call this%map_data_full(conn%owner%idsoln,
'QPACTUAL_M1', &
71 local_mem_path,
'QPACTUAL_M1', &
73 virt_mem_path = vx%get_vrt_mem_path(
'QAVAILABLE_M1',
'MVR')
74 call this%map_data_full(conn%owner%idsoln,
'QAVAILABLE_M1', &
75 local_mem_path,
'QAVAILABLE_M1', &
77 virt_mem_path = vx%get_vrt_mem_path(
'ID_MAPPED_M1',
'MVR')
78 call this%map_data_full(conn%owner%idsoln,
'ID_MAPPED_M1', &
79 local_mem_path,
'ID_MAPPED_M1', &
86 virt_mem_path = vx%get_vrt_mem_path(
'QUANTITY_M1',
'MVT')
87 call this%map_data_full(conn%owner%idsoln,
'QUANTITY_M1', &
88 local_mem_path,
'QUANTITY_M1', &
92 if (.not. vx%v_model2%is_local)
then
93 virt_mem_path = vx%get_vrt_mem_path(
'NODEM2',
'')
94 call this%map_data_full(0,
'NODEM2', conn%prim_exchange%memoryPath, &
100 virt_mem_path = vx%get_vrt_mem_path(
'QPACTUAL_M2',
'MVR')
101 call this%map_data_full(conn%owner%idsoln,
'QPACTUAL_M2', &
102 local_mem_path,
'QPACTUAL_M2', &
104 virt_mem_path = vx%get_vrt_mem_path(
'QAVAILABLE_M2',
'MVR')
105 call this%map_data_full(conn%owner%idsoln,
'QAVAILABLE_M2', &
106 local_mem_path,
'QAVAILABLE_M2', &
108 virt_mem_path = vx%get_vrt_mem_path(
'ID_MAPPED_M2',
'MVR')
109 call this%map_data_full(conn%owner%idsoln,
'ID_MAPPED_M2', &
110 local_mem_path,
'ID_MAPPED_M2', &
117 virt_mem_path = vx%get_vrt_mem_path(
'QUANTITY_M2',
'MVT')
118 call this%map_data_full(conn%owner%idsoln,
'QUANTITY_M2', &
119 local_mem_path,
'QUANTITY_M2', &
135 integer(I4B) :: iconn
141 call this%add_dist_vars(conn%owner%idsoln, &
142 conn%iface_dist_vars, &
150 integer(I4B) :: sol_id
154 integer(I4B) :: i, m, e
158 do i = 1, var_list%Count()
160 if (dist_var%map_type ==
sync_nds .or. &
162 do m = 1, iface_map%nr_models
163 call this%map_model_data(sol_id, iface_map, m, dist_var)
165 else if (dist_var%map_type ==
sync_exg)
then
166 do e = 1, iface_map%nr_exchanges
167 call this%map_exg_data(sol_id, iface_map, e, dist_var)
182 integer(I4B) :: sol_id
184 integer(I4B) :: model_idx
187 character(len=LENVARNAME) :: src_var_name
188 character(len=LENMEMPATH) :: src_mem_path, tgt_mem_path
191 integer(I4B),
dimension(:),
pointer,
contiguous :: lookup_table
195 vd => v_model%get_virtual_data(dist_var%var_name, dist_var%subcomp_name)
199 lookup_table => null()
200 if (dist_var%map_type ==
sync_nds)
then
201 idx_map => iface_map%node_maps(model_idx)
202 if (vd%is_reduced)
then
203 lookup_table => v_model%element_luts(
map_node_type)%remote_to_virtual
205 else if (dist_var%map_type ==
sync_con)
then
206 idx_map => iface_map%conn_maps(model_idx)
207 if (vd%is_reduced)
then
208 lookup_table => v_model%element_luts(
map_conn_type)%remote_to_virtual
211 write (*, *)
"Unknown map type for distributed variable ", dist_var%var_name
215 if (len_trim(dist_var%subcomp_name) > 0)
then
216 tgt_mem_path =
create_mem_path(dist_var%comp_name, dist_var%subcomp_name)
221 src_var_name = dist_var%var_name
222 src_mem_path = v_model%get_vrt_mem_path(src_var_name, dist_var%subcomp_name)
223 call this%map_data(sol_id, &
224 src_var_name, tgt_mem_path, idx_map%tgt_idx, &
225 src_var_name, src_mem_path, idx_map%src_idx, &
226 null(), lookup_table, dist_var%sync_stages)
234 integer(I4B) :: sol_id
236 integer(I4B),
intent(in) :: exg_idx
239 character(len=LENMEMPATH) :: src_mem_path, tgt_mem_path
245 idx_map => iface_map%exchange_maps(exg_idx)
247 if (len_trim(dist_var%subcomp_name) > 0)
then
248 tgt_mem_path =
create_mem_path(dist_var%comp_name, dist_var%subcomp_name)
253 src_mem_path = v_exchange%get_vrt_mem_path(dist_var%exg_var_name,
'')
254 call this%map_data(sol_id, &
255 dist_var%var_name, tgt_mem_path, idx_map%tgt_idx, &
256 dist_var%exg_var_name, src_mem_path, idx_map%src_idx, &
257 idx_map%sign, null(), dist_var%sync_stages)
263 src_name, src_path, stages)
265 integer(I4B) :: controller_id
266 character(len=*),
intent(in) :: tgt_name
267 character(len=*),
intent(in) :: tgt_path
268 character(len=*),
intent(in) :: src_name
269 character(len=*),
intent(in) :: src_path
270 integer(I4B),
dimension(:),
intent(in) :: stages
272 call this%map_data(controller_id, tgt_name, tgt_path, null(), &
273 src_name, src_path, null(), &
274 null(), null(), stages)
280 subroutine map_data(this, controller_id, tgt_name, tgt_path, tgt_idx, &
281 src_name, src_path, src_idx, sign_array, &
282 lookup_table, stages)
284 integer(I4B) :: controller_id
285 character(len=*),
intent(in) :: tgt_name
286 character(len=*),
intent(in) :: tgt_path
287 integer(I4B),
dimension(:),
pointer :: tgt_idx
288 character(len=*),
intent(in) :: src_name
289 character(len=*),
intent(in) :: src_path
290 integer(I4B),
dimension(:),
pointer :: src_idx
291 integer(I4B),
dimension(:),
pointer :: sign_array
292 integer(I4B),
dimension(:),
pointer :: lookup_table
293 integer(I4B),
dimension(:),
intent(in) :: stages
295 integer(I4B) :: istage, i
297 class(*),
pointer :: obj
301 do i = 1,
size(stages)
302 istage = ibset(istage, stages(i))
306 allocate (mapped_data)
307 mapped_data%controller_id = controller_id
308 mapped_data%sync_stage = istage
309 mapped_data%src_name = src_name
310 mapped_data%src_path = src_path
311 mapped_data%src => null()
312 mapped_data%tgt_name = tgt_name
313 mapped_data%tgt_path = tgt_path
314 mapped_data%tgt => null()
315 mapped_data%copy_all = .not.
associated(src_idx)
316 mapped_data%src_idx => src_idx
317 mapped_data%tgt_idx => tgt_idx
318 mapped_data%sign => sign_array
319 mapped_data%lut => lookup_table
321 call this%mapped_data_list%Add(obj)
327 subroutine scatter(this, controller_id, stage)
329 integer(I4B) :: controller_id
330 integer(I4B),
intent(in) :: stage
333 class(*),
pointer :: obj
337 do i = 1, this%mapped_data_list%Count()
338 obj => this%mapped_data_list%GetItem(i)
340 if (controller_id > 0 .and. &
341 mapped_data%controller_id /= controller_id) cycle
342 if (.not.
check_stage(mapped_data%sync_stage, stage)) cycle
345 call mapped_data%sync()
351 integer(I4B) :: var_stage
352 integer(I4B) :: current_stage
353 logical(LGP) :: is_sync
355 is_sync = iand(var_stage, ibset(0, current_stage)) == ibset(0, current_stage)
362 call this%mapped_data_list%Clear(
destroy=.true.)
This module contains simulation constants.
integer(i4b), parameter lenvarname
maximum length of a variable name
integer(i4b), parameter lenmempath
maximum length of the memory path
class(distvartype) function, pointer, public getdistvarfromlist(list, idx)
integer(i4b), parameter, public sync_nds
synchronize over nodes
integer(i4b), parameter, public sync_exg
synchronize as exchange variable
integer(i4b), parameter, public sync_con
synchronize over connections
subroutine init(this, nr_models, nr_exchanges)
This module defines variable data types.
type(listtype), public baseconnectionlist
class(mappedmemorytype) function, pointer, public castasmappeddata(obj)
subroutine map_data(this, controller_id, tgt_name, tgt_path, tgt_idx, src_name, src_path, src_idx, sign_array, lookup_table, stages)
Generic mapping between two variables in memory, using.
subroutine map_model_data(this, sol_id, iface_map, model_idx, dist_var)
Map data from model memory to a target memory entry, with the specified map. The source and target it...
subroutine map_exg_data(this, sol_id, iface_map, exg_idx, dist_var)
Map memory from a Exchange to the specified memory entry,.
subroutine add_dist_vars(this, sol_id, var_list, iface_map)
subroutine add_interface_vars(this)
Add distributed interface variables as memory mapped items.
subroutine add_exchange_vars(this)
Add virtual exchange variables.
logical(lgp) function check_stage(var_stage, current_stage)
subroutine map_data_full(this, controller_id, tgt_name, tgt_path, src_name, src_path, stages)
Full copy between two variables in memory.
subroutine scatter(this, controller_id, stage)
Scatter the mapped memory, typically into.
character(len=lenmempath) function create_mem_path(component, subcomponent, context)
returns the path to the memory object
This module contains simulation methods.
subroutine, public ustop(stopmess, ioutlocal)
Stop the simulation.
integer(i4b), parameter, public stg_bfr_exg_fc
before exchange formulate (per solution)
integer(i4b), parameter, public stg_aft_con_rp
after connection read prepare
integer(i4b), parameter, public stg_bfr_con_df
before connection define
class(spatialmodelconnectiontype) function, pointer, public get_smc_from_list(list, idx)
Get the connection from a list.
integer(i4b), parameter, public map_conn_type
integer(i4b), parameter, public map_node_type
integer(i4b), parameter, public vdc_gwtexg_type
integer(i4b), parameter, public vdc_gwfexg_type
integer(i4b), parameter, public vdc_gweexg_type
class(virtualexchangetype) function, pointer, public get_virtual_exchange(exg_id)
Returns a virtual exchange with the specified id.
A generic heterogeneous doubly-linked list.
Class to manage spatial connection of a model to one or more models of the same type....
This is a generic data structure to virtualize pieces of memory in 2 distinct ways:
The Virtual Exchange is based on two Virtual Models and is therefore not always strictly local or rem...