forked from ecmwf-ifs/field_api
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfield_RANKSUFF_array_util_module.fypp
122 lines (83 loc) · 2.74 KB
/
field_RANKSUFF_array_util_module.fypp
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
#! (C) Copyright 2022- ECMWF.
#! (C) Copyright 2022- Meteo-France.
#!
#! This software is licensed under the terms of the Apache Licence Version 2.0
#! which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
#! In applying this licence, ECMWF does not waive the privileges and immunities
#! granted to it by virtue of its status as an intergovernmental organisation
#! nor does it submit to any jurisdiction.
MODULE FIELD_${RANK}$${SUFF}$_ARRAY_UTIL_MODULE
#:set fieldTypeList = fieldType.getFieldTypeList (ranks=[RANK], kinds=['JP' + SUFF], hasView=True)
USE FIELD_${RANK}$${SUFF}$_ARRAY_MODULE
${fieldType.useParkind1 ()}$
IMPLICIT NONE
#:if len (fieldTypeList) > 0
#:for method in ['LOAD', 'SAVE', 'COPY', 'WIPE', 'HOST']
INTERFACE ${method}$
#:for ft in fieldTypeList
MODULE PROCEDURE ${method}$_${ft.name}$_ARRAY
#:endfor
END INTERFACE
#:endfor
#:endif
CONTAINS
#:for ft in fieldTypeList
SUBROUTINE LOAD_${ft.name}$_ARRAY (KLUN, YD)
USE FIELD_${RANK}$${SUFF}$_UTIL_MODULE, ONLY : LOAD
INTEGER (KIND=JPIM), INTENT (IN) :: KLUN
TYPE (${ft.name}$_ARRAY) :: YD
IF (ASSOCIATED (YD%F_P)) THEN
CALL LOAD (KLUN, YD%F_P)
ENDIF
END SUBROUTINE
SUBROUTINE SAVE_${ft.name}$_ARRAY (KLUN, YD)
USE FIELD_${RANK}$${SUFF}$_UTIL_MODULE, ONLY : SAVE
INTEGER (KIND=JPIM), INTENT (IN) :: KLUN
TYPE (${ft.name}$_ARRAY) :: YD
END SUBROUTINE
SUBROUTINE COPY_${ft.name}$_ARRAY (SELF, LDCREATED, LDFIELDAPI)
USE FIELD_${RANK}$${SUFF}$_UTIL_MODULE, ONLY : COPY
TYPE (${ft.name}$_ARRAY) :: SELF
LOGICAL, INTENT (IN), OPTIONAL :: LDCREATED, LDFIELDAPI
LOGICAL :: LLFIELDAPI, LLCREATED
LLFIELDAPI = .FALSE.
IF (PRESENT (LDFIELDAPI)) LLFIELDAPI = LDFIELDAPI
LLCREATED = .FALSE.
IF (PRESENT (LDCREATED)) LLCREATED = LDCREATED
IF (.NOT. LLCREATED) THEN
!$acc enter data create (SELF)
!$acc update device (SELF)
ENDIF
!$acc serial present (SELF)
NULLIFY (SELF%P)
NULLIFY (SELF%F_P)
!$acc end serial
IF (LLFIELDAPI .AND. ASSOCIATED (SELF%F_P)) THEN
CALL COPY (SELF%F_P, LDCREATED)
ENDIF
END SUBROUTINE
SUBROUTINE WIPE_${ft.name}$_ARRAY (SELF, LDDELETED, LDFIELDAPI)
USE FIELD_${RANK}$${SUFF}$_UTIL_MODULE, ONLY : WIPE
TYPE (${ft.name}$_ARRAY) :: SELF
LOGICAL, INTENT (IN), OPTIONAL :: LDDELETED, LDFIELDAPI
LOGICAL :: LLFIELDAPI, LLDELETED
LLFIELDAPI = .FALSE.
IF (PRESENT (LDFIELDAPI)) LLFIELDAPI = LDFIELDAPI
LLDELETED = .FALSE.
IF (PRESENT (LDDELETED)) LLDELETED = LDDELETED
IF (LLFIELDAPI .AND. ASSOCIATED (SELF%F_P)) THEN
CALL WIPE (SELF%F_P, LDDELETED)
ENDIF
IF (.NOT. LLDELETED) THEN
!$acc exit data delete (SELF)
ENDIF
END SUBROUTINE
SUBROUTINE HOST_${ft.name}$_ARRAY (SELF)
USE FIELD_${RANK}$${SUFF}$_UTIL_MODULE, ONLY : HOST
TYPE (${ft.name}$_ARRAY) :: SELF
IF (ASSOCIATED (SELF%F_P)) THEN
CALL HOST (SELF%F_P)
ENDIF
END SUBROUTINE
#:endfor
END MODULE