My Project
 All Classes Files Functions Variables Macros
write_field_loc.F90
Go to the documentation of this file.
2 implicit none
3 
4  interface writefield_u
5  module procedure write_field1d_u,write_field2d_u
6  end interface writefield_u
7 
8  interface writefield_v
9  module procedure write_field1d_v,write_field2d_v
10  end interface writefield_v
11 
12  contains
13 
14  subroutine write_field1d_u(name,Field)
15  character(len=*) :: name
16  real, dimension(:) :: field
17 
18  CALL write_field_u_gen(name,field,1)
19 
20  end subroutine write_field1d_u
21 
22  subroutine write_field2d_u(name,Field)
23  implicit none
24 
25  character(len=*) :: name
26  real, dimension(:,:) :: field
27  integer :: ll
28 
29  ll=size(field,2)
30  CALL write_field_u_gen(name,field,ll)
31 
32  end subroutine write_field2d_u
33 
34 
35  SUBROUTINE write_field_u_gen(name,Field,ll)
36  USE parallel
37  USE write_field
38  USE mod_hallo
39  implicit none
40  include 'dimensions.h'
41  include 'paramet.h'
42 
43  character(len=*) :: name
44  real, dimension(ijb_u:ije_u,ll) :: field
45  real, allocatable,SAVE :: new_field(:,:,:)
46  integer,dimension(0:mpi_size-1) :: jj_nb_master
47  type(request) :: request_write
48  integer :: ll,i
49 
50 
51  jj_nb_master(:)=0
52  jj_nb_master(0)=jjp1
53 !$OMP BARRIER
54 !$OMP MASTER
55  allocate(new_field(iip1,jjp1,ll))
56 !$OMP END MASTER
57 !$OMP BARRIER
58 
59 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
60  DO i=1,ll
61  new_field(:,jj_begin:jj_end,i)=reshape(field(ij_begin:ij_end,i),(/iip1,jj_nb/))
62  ENDDO
63 
64  call register_swapfield(new_field,new_field,ip1jmp1,ll,jj_nb_master,request_write)
65  call sendrequest(request_write)
66 !$OMP BARRIER
67  call waitrequest(request_write)
68 !$OMP BARRIER
69 
70 !$OMP MASTER
71  if (mpi_rank==0) call writefield(name,new_field)
72  DEALLOCATE(new_field)
73 !$OMP END MASTER
74 !$OMP BARRIER
75  END SUBROUTINE write_field_u_gen
76 
77 
78  subroutine write_field1d_v(name,Field)
79  character(len=*) :: name
80  real, dimension(:) :: field
81 
82  CALL write_field_v_gen(name,field,1)
83 
84  end subroutine write_field1d_v
85 
86  subroutine write_field2d_v(name,Field)
87  implicit none
88 
89  character(len=*) :: name
90  real, dimension(:,:) :: field
91  integer :: ll
92 
93  ll=size(field,2)
94  CALL write_field_v_gen(name,field,ll)
95 
96  end subroutine write_field2d_v
97 
98 
99  SUBROUTINE write_field_v_gen(name,Field,ll)
100  USE parallel
101  USE write_field
102  USE mod_hallo
103  implicit none
104  include 'dimensions.h'
105  include 'paramet.h'
106 
107  character(len=*) :: name
108  real, dimension(ijb_v:ije_v,ll) :: field
109  real, allocatable,SAVE :: new_field(:,:,:)
110  integer,dimension(0:mpi_size-1) :: jj_nb_master
111  type(request) :: request_write
112  integer :: ll,i,jje,ije,jjn
113 
114 
115  jj_nb_master(:)=0
116  jj_nb_master(0)=jjp1
117 
118 !$OMP BARRIER
119 !$OMP MASTER
120  allocate(new_field(iip1,jjm,ll))
121 !$OMP END MASTER
122 !$OMP BARRIER
123 
124  IF (pole_sud) THEN
125  jje=jj_end-1
126  ije=ij_end-iip1
127  jjn=jj_nb-1
128  ELSE
129  jje=jj_end
130  ije=ij_end
131  jjn=jj_nb
132  ENDIF
133 
134 !$OMP DO SCHEDULE(STATIC,OMP_CHUNK)
135  DO i=1,ll
136  new_field(:,jj_begin:jje,i)=reshape(field(ij_begin:ije,i),(/iip1,jjn/))
137  ENDDO
138 
139  call register_swapfield(new_field,new_field,ip1jm,ll,jj_nb_master,request_write)
140  call sendrequest(request_write)
141 !$OMP BARRIER
142  call waitrequest(request_write)
143 !$OMP BARRIER
144 
145 !$OMP MASTER
146  if (mpi_rank==0) call writefield(name,new_field)
147  DEALLOCATE(new_field)
148 !$OMP END MASTER
149 !$OMP BARRIER
150  END SUBROUTINE write_field_v_gen
151 
152 end module write_field_loc
153