1 | MODULE mod_oasis_var |
---|
2 | |
---|
3 | USE mod_oasis_kinds |
---|
4 | USE mod_oasis_data |
---|
5 | USE mod_oasis_parameters |
---|
6 | USE mod_oasis_sys |
---|
7 | |
---|
8 | IMPLICIT none |
---|
9 | |
---|
10 | private |
---|
11 | |
---|
12 | !--- interfaces --- |
---|
13 | public oasis_def_var |
---|
14 | |
---|
15 | !--- datatypes --- |
---|
16 | |
---|
17 | integer(kind=ip_intwp_p),public :: prism_nvar = 0 |
---|
18 | |
---|
19 | CONTAINS |
---|
20 | |
---|
21 | !--------------------------------------------------------------- |
---|
22 | |
---|
23 | SUBROUTINE oasis_def_var(id_nports, cdport, id_part, & |
---|
24 | id_var_nodims, kinout, id_var_shape, ktype, kinfo) |
---|
25 | ! --------------------------------------------------------------- |
---|
26 | INTEGER(kind=ip_i4_p) :: kinout, ktype, id_nports,id_part |
---|
27 | INTEGER(kind=ip_i4_p) :: id_var_nodims(2),id_var_shape(2*id_var_nodims(1)) |
---|
28 | CHARACTER(len=*) :: cdport |
---|
29 | INTEGER(kind=ip_i4_p),optional :: kinfo |
---|
30 | ! --------------------------------------------------------------- |
---|
31 | INTEGER(kind=ip_i4_p) :: n |
---|
32 | character(len=*),parameter :: subname = 'oasis_def_var' |
---|
33 | LOGICAL :: l_field_in_namcouple |
---|
34 | ! --------------------------------------------------------------- |
---|
35 | |
---|
36 | call oasis_debug_enter(subname) |
---|
37 | |
---|
38 | kinfo = OASIS_Ok |
---|
39 | |
---|
40 | l_field_in_namcouple = .FALSE. |
---|
41 | do n = 1,mvar |
---|
42 | if (trim(cdport) == trim(total_namsrcfld(n)) .OR. trim(cdport) == trim(total_namdstfld(n))) & |
---|
43 | & l_field_in_namcouple = .TRUE. |
---|
44 | enddo |
---|
45 | |
---|
46 | if (.not. l_field_in_namcouple) then |
---|
47 | id_nports = OASIS_Var_Uncpl |
---|
48 | if (OASIS_debug >= 2) then |
---|
49 | write(nulprt,*) subname,' variable not in namcouple return ',trim(cdport) |
---|
50 | call oasis_flush(nulprt) |
---|
51 | endif |
---|
52 | call oasis_debug_exit(subname) |
---|
53 | return |
---|
54 | endif |
---|
55 | |
---|
56 | |
---|
57 | do n = 1,prism_nvar |
---|
58 | if (trim(cdport) == trim(prism_var(n)%name)) then |
---|
59 | write(nulprt,*) subname,' variable already defined with var_def ',trim(cdport) |
---|
60 | WRITE(nulprt,*) subname,' abort by model :',compid,' proc :',mpi_rank_local |
---|
61 | CALL oasis_flush(nulprt) |
---|
62 | call oasis_abort_noarg() |
---|
63 | endif |
---|
64 | enddo |
---|
65 | |
---|
66 | prism_nvar = prism_nvar + 1 |
---|
67 | id_nports = prism_nvar |
---|
68 | |
---|
69 | |
---|
70 | if (prism_nvar > mvar) then |
---|
71 | write(nulprt,*) subname,' ERROR prism_nvar too large ',prism_nvar,mvar |
---|
72 | WRITE(nulprt,*) subname,' abort by model :',compid,' proc :',mpi_rank_local |
---|
73 | CALL oasis_flush(nulprt) |
---|
74 | call oasis_abort_noarg() |
---|
75 | endif |
---|
76 | |
---|
77 | prism_var(prism_nvar)%name = trim(cdport) |
---|
78 | prism_var(prism_nvar)%part = id_part |
---|
79 | prism_var(prism_nvar)%ndim = id_var_nodims(1) |
---|
80 | prism_var(prism_nvar)%num = id_var_nodims(2) |
---|
81 | prism_var(prism_nvar)%ops = kinout |
---|
82 | prism_var(prism_nvar)%type = ktype |
---|
83 | prism_var(prism_nvar)%size = 1 |
---|
84 | do n = 1,prism_var(prism_nvar)%ndim |
---|
85 | prism_var(prism_nvar)%size = prism_var(prism_nvar)%size*(id_var_shape(2*n)-& |
---|
86 | id_var_shape(2*n-1)+1) |
---|
87 | enddo |
---|
88 | prism_var(prism_nvar)%ncpl = 0 |
---|
89 | prism_var(prism_nvar)%cpl = 0 |
---|
90 | |
---|
91 | !---------------------------------- |
---|
92 | !--- some diagnostics |
---|
93 | !---------------------------------- |
---|
94 | if (OASIS_debug >= 2) then |
---|
95 | write(nulprt,*) ' ' |
---|
96 | write(nulprt,*) subname,' prism_nvar = ',prism_nvar |
---|
97 | write(nulprt,*) subname,' varname = ',prism_nvar,trim(prism_var(prism_nvar)%name) |
---|
98 | write(nulprt,*) subname,' varpart = ',prism_nvar,prism_var(prism_nvar)%part |
---|
99 | write(nulprt,*) subname,' varndim = ',prism_nvar,prism_var(prism_nvar)%ndim |
---|
100 | write(nulprt,*) subname,' varnum = ',prism_nvar,prism_var(prism_nvar)%num |
---|
101 | write(nulprt,*) subname,' varops = ',prism_nvar,prism_var(prism_nvar)%ops |
---|
102 | write(nulprt,*) subname,' vartype = ',prism_nvar,prism_var(prism_nvar)%type |
---|
103 | write(nulprt,*) subname,' varsize = ',prism_nvar,prism_var(prism_nvar)%size |
---|
104 | write(nulprt,*) ' ' |
---|
105 | CALL oasis_flush(nulprt) |
---|
106 | endif |
---|
107 | |
---|
108 | call oasis_debug_exit(subname) |
---|
109 | |
---|
110 | END SUBROUTINE oasis_def_var |
---|
111 | |
---|
112 | END MODULE mod_oasis_var |
---|
113 | |
---|