-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy pathExtDataDriverMod.F90
238 lines (185 loc) · 7.29 KB
/
ExtDataDriverMod.F90
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
#include "MAPL_Generic.h"
module ExtDataDriverMod
use MPI
use ESMF
use MAPL
use ExtData_DriverGridCompMod, only: ExtData_DriverGridComp, new_ExtData_DriverGridComp
use ExtDataUtRoot_GridCompMod, only: ROOT_SetServices => SetServices
use gFTL_StringVector
use MAPL_ApplicationSupport
use MAPL_ServerManager
use, intrinsic :: iso_fortran_env, only: output_unit, REAL64, INT64
implicit none
public :: ExtDataDriver
type :: ExtDataDriver
private
procedure(), nopass, pointer :: set_services => null()
integer :: rank
integer :: comm_world
character(:), allocatable :: name
type(ServerManager) :: cap_server
type (ESMF_LogKind_Flag) :: esmf_logging_mode = ESMF_LOGKIND_NONE
type (MAPL_CapOptions) :: cap_options
type(SplitCommunicator) :: split_comm
contains
procedure :: run
procedure :: initialize_io_clients_servers
procedure :: finalize_io_clients_servers
procedure :: initialize_mpi
end type ExtDataDriver
interface ExtDataDriver
module procedure newExtDataDriver
end interface
contains
function newExtDataDriver(name,set_services, unusable, cap_options, rc) result(driver)
type(ExtDataDriver) :: driver
character(*), intent(in) :: name
procedure() :: set_services
class(KeywordEnforcer), optional, intent(in) :: unusable
class(MAPL_CapOptions), optional, intent(in) :: cap_options
integer, optional, intent(out) :: rc
integer :: status
_UNUSED_DUMMY(unusable)
driver%name = name
driver%set_services => set_services
if (present(cap_options)) then
driver%cap_options = cap_options
else
driver%cap_options = MAPL_CapOptions()
endif
call driver%initialize_mpi()
call MAPL_Initialize(comm=MPI_COMM_WORLD, &
logging_config=driver%cap_options%logging_config, &
rc=status)
_VERIFY(status)
_RETURN(_SUCCESS)
end function newExtDataDriver
subroutine run(this,RC)
class(ExtDataDriver), intent(inout) :: this
integer, optional, intent(OUT) :: rc
type(ESMF_Config) :: config
integer :: STATUS
integer :: CommCap
type (ESMF_VM) :: VM
type(ExtData_DriverGridComp), target :: cap
integer :: lineCount, columnCount,i,rank
character(len=ESMF_MAXSTR) :: ctemp
character(len=:), pointer :: cname
type(StringVector) :: cases
type(StringVectorIterator) :: iter
type(SplitCommunicator) :: split_comm
CommCap = MPI_COMM_WORLD
call this%initialize_io_clients_servers(commCap, rc = status); _VERIFY(status)
call this%cap_server%get_splitcomm(split_comm)
select case(split_comm%get_name())
case('model')
call ESMF_Initialize (vm=vm, logKindFlag=this%cap_options%esmf_logging_mode, &
& mpiCommunicator=split_comm%get_subcommunicator(), rc=status)
_VERIFY(STATUS)
config = ESMF_ConfigCreate(rc=status)
_VERIFY(status)
call ESMF_ConfigLoadFile ( config, 'CAP.rc', rc=STATUS )
_VERIFY(status)
call ESMF_ConfigGetDim(config,lineCount,columnCount,label='CASES::',rc=status)
_VERIFY(status)
call ESMF_ConfigFindLabel(config,label='CASES::',rc=status)
_VERIFY(status)
do i=1,lineCount
call ESMF_ConfigNextLine(config,rc=status)
_VERIFY(status)
call ESMF_ConfigGetAttribute(config,ctemp,rc=status)
_VERIFY(status)
call cases%push_back(trim(ctemp))
enddo
call ESMF_ConfigDestroy(config, rc=status)
_VERIFY(status)
iter = cases%begin()
do while (iter /= cases%end())
if (mapl_am_I_root()) write(*,*)"Running new case"
cname => iter%get()
cap = new_ExtData_DriverGridComp(root_setservices, name=this%name, configFileName=cname)
call cap%set_services(rc = status)
_VERIFY(status)
call cap%initialize(rc = status)
_VERIFY(status)
call cap%run(rc=status)
_VERIFY(status)
call cap%finalize(rc = status)
_VERIFY(status)
call iter%next()
enddo
end select
! Finalize framework
! ------------------
call MPI_Comm_Rank(CommCap,rank,status)
_VERIFY(status)
if (rank==0) then
close(99)
open(99,file='egress',form='formatted')
close(99)
end if
call this%finalize_io_clients_servers()
call MAPL_Finalize(rc=status)
_VERIFY(status)
call mpi_finalize(status)
_VERIFY(STATUS)
_RETURN(ESMF_SUCCESS)
end subroutine run
subroutine initialize_io_clients_servers(this, comm, unusable, rc)
use MAPL_CFIOMod
class (ExtDataDriver), target, intent(inout) :: this
integer, intent(in) :: comm
class (KeywordEnforcer), optional, intent(in) :: unusable
integer, optional, intent(out) :: rc
integer :: status
_UNUSED_DUMMY(unusable)
call this%cap_server%initialize(comm, &
application_size=this%cap_options%npes_model, &
nodes_input_server=this%cap_options%nodes_input_server, &
nodes_output_server=this%cap_options%nodes_output_server, &
npes_input_server=this%cap_options%npes_input_server, &
npes_output_server=this%cap_options%npes_output_server, &
oserver_type=this%cap_options%oserver_type, &
npes_backend_pernode=this%cap_options%npes_backend_pernode, &
isolate_nodes = this%cap_options%isolate_nodes, &
fast_oclient = this%cap_options%fast_oclient, &
with_profiler = this%cap_options%with_io_profiler, &
rc=status)
_VERIFY(status)
_RETURN(_SUCCESS)
end subroutine initialize_io_clients_servers
subroutine finalize_io_clients_servers(this, unusable, rc)
class (ExtDataDriver), target, intent(inout) :: this
class (KeywordEnforcer), optional, intent(in) :: unusable
integer, optional, intent(out) :: rc
type(SplitCommunicator) :: split_comm
_UNUSED_DUMMY(unusable)
call this%cap_server%get_splitcomm(split_comm)
select case(split_comm%get_name())
case('model')
call i_Clients%terminate()
call o_Clients%terminate()
end select
call this%cap_server%finalize()
_RETURN(_SUCCESS)
end subroutine finalize_io_clients_servers
subroutine initialize_mpi(this, unusable, rc)
class (ExtDataDriver), intent(inout) :: this
class (KeywordEnforcer), optional, intent(in) :: unusable
integer, optional, intent(out) :: rc
integer :: ierror
integer :: npes_world
_UNUSED_DUMMY(unusable)
call MPI_Init(ierror)
_VERIFY(ierror)
this%comm_world=MPI_COMM_WORLD
call MPI_Comm_rank(this%comm_world, this%rank, ierror); _VERIFY(ierror)
call MPI_Comm_size(this%comm_world, npes_world, ierror); _VERIFY(ierror)
if ( this%cap_options%npes_model == -1) then
! just a feed back to cap_options to maintain integrity
this%cap_options%npes_model = npes_world
endif
_ASSERT(npes_world >= this%cap_options%npes_model, "npes_world is smaller than npes_model")
_RETURN(_SUCCESS)
end subroutine initialize_mpi
end module ExtDataDriverMod