1!Crown Copyright 2012 AWE. 2! 3! This file is part of CloverLeaf. 4! 5! CloverLeaf is free software: you can redistribute it and/or modify it under 6! the terms of the GNU General Public License as published by the 7! Free Software Foundation, either version 3 of the License, or (at your option) 8! any later version. 9! 10! CloverLeaf is distributed in the hope that it will be useful, but 11! WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12! FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more 13! details. 14! 15! You should have received a copy of the GNU General Public License along with 16! CloverLeaf. If not, see http://www.gnu.org/licenses/. 17 18!> @brief Allocates the data for each mesh chunk 19!> @author Wayne Gaudin 20!> @details The data fields for the mesh chunk are allocated based on the mesh 21!> size. 22 23MODULE build_field_module 24 25CONTAINS 26 27SUBROUTINE build_field(chunk,x_cells,y_cells,z_cells) 28 29 USE clover_module 30 31 IMPLICIT NONE 32 33 INTEGER :: chunk,x_cells,y_cells,z_cells 34 35 chunks(chunk)%field%x_min=1 36 chunks(chunk)%field%y_min=1 37 chunks(chunk)%field%z_min=1 38 39 chunks(chunk)%field%x_max=x_cells 40 chunks(chunk)%field%y_max=y_cells 41 chunks(chunk)%field%z_max=z_cells 42 43 ALLOCATE(chunks(chunk)%field%density0 (chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+2, & 44 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+2, & 45 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+2)) 46 ALLOCATE(chunks(chunk)%field%density1 (chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+2, & 47 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+2, & 48 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+2)) 49 ALLOCATE(chunks(chunk)%field%energy0 (chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+2, & 50 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+2, & 51 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+2)) 52 ALLOCATE(chunks(chunk)%field%energy1 (chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+2, & 53 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+2, & 54 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+2)) 55 ALLOCATE(chunks(chunk)%field%pressure (chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+2, & 56 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+2, & 57 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+2)) 58 ALLOCATE(chunks(chunk)%field%viscosity (chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+2, & 59 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+2, & 60 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+2)) 61 ALLOCATE(chunks(chunk)%field%soundspeed(chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+2, & 62 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+2, & 63 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+2)) 64 65 ALLOCATE(chunks(chunk)%field%xvel0(chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+3, & 66 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+3, & 67 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+3)) 68 ALLOCATE(chunks(chunk)%field%xvel1(chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+3, & 69 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+3, & 70 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+3)) 71 ALLOCATE(chunks(chunk)%field%yvel0(chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+3, & 72 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+3, & 73 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+3)) 74 ALLOCATE(chunks(chunk)%field%yvel1(chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+3, & 75 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+3, & 76 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+3)) 77 ALLOCATE(chunks(chunk)%field%zvel0(chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+3, & 78 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+3, & 79 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+3)) 80 ALLOCATE(chunks(chunk)%field%zvel1(chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+3, & 81 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+3, & 82 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+3)) 83 84 85 ALLOCATE(chunks(chunk)%field%vol_flux_x (chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+3, & 86 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+2, & 87 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+2)) 88 ALLOCATE(chunks(chunk)%field%mass_flux_x(chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+3, & 89 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+2, & 90 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+2)) 91 ALLOCATE(chunks(chunk)%field%vol_flux_y (chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+2, & 92 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+3, & 93 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+2)) 94 ALLOCATE(chunks(chunk)%field%mass_flux_y(chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+2, & 95 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+3, & 96 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+2)) 97 ALLOCATE(chunks(chunk)%field%vol_flux_z (chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+2, & 98 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+2, & 99 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+3)) 100 ALLOCATE(chunks(chunk)%field%mass_flux_z(chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+2, & 101 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+2, & 102 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+3)) 103 104 ALLOCATE(chunks(chunk)%field%work_array1(chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+3, & 105 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+3, & 106 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+3)) 107 ALLOCATE(chunks(chunk)%field%work_array2(chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+3, & 108 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+3, & 109 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+3)) 110 ALLOCATE(chunks(chunk)%field%work_array3(chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+3, & 111 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+3, & 112 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+3)) 113 ALLOCATE(chunks(chunk)%field%work_array4(chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+3, & 114 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+3, & 115 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+3)) 116 ALLOCATE(chunks(chunk)%field%work_array5(chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+3, & 117 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+3, & 118 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+3)) 119 ALLOCATE(chunks(chunk)%field%work_array6(chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+3, & 120 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+3, & 121 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+3)) 122 ALLOCATE(chunks(chunk)%field%work_array7(chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+3, & 123 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+3, & 124 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+3)) 125 126 ALLOCATE(chunks(chunk)%field%cellx (chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+2)) 127 ALLOCATE(chunks(chunk)%field%celly (chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+2)) 128 ALLOCATE(chunks(chunk)%field%cellz (chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+2)) 129 ALLOCATE(chunks(chunk)%field%vertexx (chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+3)) 130 ALLOCATE(chunks(chunk)%field%vertexy (chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+3)) 131 ALLOCATE(chunks(chunk)%field%vertexz (chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+3)) 132 ALLOCATE(chunks(chunk)%field%celldx (chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+2)) 133 ALLOCATE(chunks(chunk)%field%celldy (chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+2)) 134 ALLOCATE(chunks(chunk)%field%celldz (chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+2)) 135 ALLOCATE(chunks(chunk)%field%vertexdx(chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+3)) 136 ALLOCATE(chunks(chunk)%field%vertexdy(chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+3)) 137 ALLOCATE(chunks(chunk)%field%vertexdz(chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+3)) 138 ALLOCATE(chunks(chunk)%field%volume (chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+2, & 139 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+2, & 140 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+2)) 141 ALLOCATE(chunks(chunk)%field%xarea (chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+3, & 142 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+2, & 143 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+2)) 144 ALLOCATE(chunks(chunk)%field%yarea (chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+2, & 145 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+3, & 146 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+2)) 147 ALLOCATE(chunks(chunk)%field%zarea (chunks(chunk)%field%x_min-2:chunks(chunk)%field%x_max+2, & 148 chunks(chunk)%field%y_min-2:chunks(chunk)%field%y_max+2, & 149 chunks(chunk)%field%z_min-2:chunks(chunk)%field%z_max+3)) 150 151 ! Zeroing isn't strictly neccessary but it ensures physical pages 152 ! are allocated. This prevents first touch overheads in the main code 153 ! cycle which can skew timings in the first step 154!$OMP PARALLEL 155 chunks(chunk)%field%work_array1=0.0 156 chunks(chunk)%field%work_array2=0.0 157 chunks(chunk)%field%work_array3=0.0 158 chunks(chunk)%field%work_array4=0.0 159 chunks(chunk)%field%work_array5=0.0 160 chunks(chunk)%field%work_array6=0.0 161 chunks(chunk)%field%work_array7=0.0 162 163 chunks(chunk)%field%density0=0.0 164 chunks(chunk)%field%density1=0.0 165 chunks(chunk)%field%energy0=0.0 166 chunks(chunk)%field%energy1=0.0 167 chunks(chunk)%field%pressure=0.0 168 chunks(chunk)%field%viscosity=0.0 169 chunks(chunk)%field%soundspeed=0.0 170 171 chunks(chunk)%field%xvel0=0.0 172 chunks(chunk)%field%xvel1=0.0 173 chunks(chunk)%field%yvel0=0.0 174 chunks(chunk)%field%yvel1=0.0 175 chunks(chunk)%field%zvel0=0.0 176 chunks(chunk)%field%zvel1=0.0 177 178 chunks(chunk)%field%vol_flux_x=0.0 179 chunks(chunk)%field%mass_flux_x=0.0 180 chunks(chunk)%field%vol_flux_y=0.0 181 chunks(chunk)%field%mass_flux_y=0.0 182 chunks(chunk)%field%vol_flux_z=0.0 183 chunks(chunk)%field%mass_flux_z=0.0 184 185 chunks(chunk)%field%cellx=0.0 186 chunks(chunk)%field%celly=0.0 187 chunks(chunk)%field%cellz=0.0 188 chunks(chunk)%field%vertexx=0.0 189 chunks(chunk)%field%vertexy=0.0 190 chunks(chunk)%field%vertexz=0.0 191 chunks(chunk)%field%celldx=0.0 192 chunks(chunk)%field%celldy=0.0 193 chunks(chunk)%field%vertexdx=0.0 194 chunks(chunk)%field%vertexdy=0.0 195 chunks(chunk)%field%vertexdz=0.0 196 chunks(chunk)%field%volume=0.0 197 chunks(chunk)%field%xarea=0.0 198 chunks(chunk)%field%yarea=0.0 199 chunks(chunk)%field%zarea=0.0 200!$OMP END PARALLEL 201 202END SUBROUTINE build_field 203 204END MODULE build_field_module 205