source: trunk/source/g3tog4/src/g3tog4.F@ 1199

Last change on this file since 1199 was 965, checked in by garnier, 17 years ago

update g3tog4

File size: 11.4 KB
RevLine 
[817]1*
2* ********************************************************************
3* * License and Disclaimer *
4* * *
5* * The Geant4 software is copyright of the Copyright Holders of *
6* * the Geant4 Collaboration. It is provided under the terms and *
7* * conditions of the Geant4 Software License, included in the file *
8* * LICENSE and available at http://cern.ch/geant4/license . These *
9* * include a list of copyright holders. *
10* * *
11* * Neither the authors of this software system, nor their employing *
12* * institutes,nor the agencies providing financial support for this *
13* * work make any representation or warranty, express or implied, *
14* * regarding this software system or assume any liability for its *
15* * use. Please see the license in the file LICENSE and URL above *
16* * for the full disclaimer and the limitation of liability. *
17* * *
18* * This code implementation is the result of the scientific and *
19* * technical work of the GEANT4 collaboration. *
20* * By using, copying, modifying or distributing the software (or *
21* * any work based on the software) you agree to acknowledge its *
22* * use in resulting scientific publications, and indicate your *
23* * acceptance of all terms of the Geant4 Software license. *
24* ********************************************************************
25*
26*
27* $Id: g3tog4.F,v 1.5 2006/06/29 18:15:12 gunter Exp $
[965]28* GEANT4 tag $Name: geant4-09-02-ref-02 $
[817]29*
30*
31* G3toG4
32*
33* Package to convert Geant3 Fortran geometry code to a call list
34* file to be interpreted by the Geant4 geometry call list
35* interpreter, or alternatively, directly to Geant4 code.
36*
37* This set of routines is to be linked in front of, so overriding,
38* the standard Geant library.
39*
40* It is possible to execute the Geant calls while at the same
41* time building the call list/Geant4 code. In order to do this,
42* these routines must occupy a different name space to that of
43* the real Geant routines. This is provided by the CALL_GEANT
44* cpp flag. If these routines are compiled with this flag,
45* the routine names begin with K rather than G. eg. GSVOLU
46* becomes KSVOLU. Routine names in your source code must be so
47* converted; a perl script is provided to do this.
48* $$$ provide the script
49* Under normal circumstances it should *not* be necessary to go
50* through this; it is only necessary if during the geometry
51* generation process your code extracts information from Geant
52* about material already generated.
53*
54* Torre Wenaus, LLNL 6/95
55*
56* To Do
57* - option to divide generated Geant4 code into separate files/routines
58* based on context
59*
60************************************************************************
61*
62 subroutine G3toG4(luni,lunc,chopt)
63************************************************************************
64*
65* G3toG4
66*
67* Initialization/setup routine
68*
69* luni (call list), lunc (C++ code) logical unit numbers:
70* lun>0: Open output file on unit lun. Filenames used:
71* g3calls.dat Call list file
72* g4geom.cc Geant4 C++ geometry code
73* lun<0: File open has been done by the user. Just write to |lun|
74* lun=0: Don't generate this output.
75* ie. luni=0: Don't generate the call list
76* lunc=0: Don't generate the Geant4 code
77*
78* chopt options:
79* 'G' execute the actual Geant calls as well as building the
80* code/call list. In case users use info obtained from Geant
81* during the geometry building process. THIS IS THE DEFAULT
82* at present:
83#define CALL_GEANT
84*
85************************************************************************
86 implicit none
87 integer luni, lunc
88 character chopt*(*)
89#include "G3toG4.inc"
90*
91 print *,'Initializing Geant3 to Geant4 conversion'
92#ifdef CALL_GEANT
93c dogeom = index(chopt,'G') + index(chopt,'g') .ne. 0
94 dogeom = .true.
95#else
96 dogeom = .false.
97#endif
98 context = '----'
99 if (luni.eq.0.and.lunc.eq.0) then
100 print *,'G3TOG4: No output requested by user. No output'//
101 + ' will be generated.'
102 endif
103 lunlist = abs(luni)
104 luncode = abs(lunc)
105 if (lunlist.ne.0) then
106 doclist = .true.
107 else
108 doclist = .false.
109 endif
110 if (luncode.ne.0) then
111 docode = .true.
112 else
113 docode = .false.
114 endif
115*** If lun>0, open the file
116 if (lunlist.gt.0) then
117 open(unit=lunlist,file='g3calls.dat',status='unknown')
118 endif
119 if (luncode.gt.0) then
120 nfile = 1
121 call g3source
122 endif
123*
124 end
125*
126 subroutine g4init
127************************************************************************
128************************************************************************
129 implicit none
130#include "G3toG4.inc"
131*
132 if (luncode.ne.0) then
133 write(luncode,
134 + '(''//G4GeometryManager* GeoMgr = new G4GeometryManager();'')')
135* call ctocp('void G3G4init();')
136 endif
137*
138 end
139*
140 subroutine g3header
141************************************************************************
142*
143************************************************************************
144 implicit none
145 call g4init
146 end
147
148 subroutine g3source
149************************************************************************
150*
151************************************************************************
152 implicit none
153#include "G3toG4.inc"
154 character fname*30
155 if (luncode.le.0) return
156 if (nfile.gt.1) write(luncode,'(''}'')')
157 close(luncode)
158 write (fname,'(''G3toG4code_'',i2.2,''.cc'')') nfile
159 open(unit=luncode,file=fname,status='unknown')
160 write(luncode,'(''#include "G3toG4.hh"'')')
161 if (nfile.eq.1) call g3header
162 write(luncode,'(/''void G3toG4code_'',i2.2,''()'')') nfile
163 write(luncode,'(''{'')')
164 call ctocp('// init to 0 avoids "unused" warnings')
165 call ctocp('G4int nd=0,nh=0,nv=0,imate=0,itmed=0,nmat=0,')
166 call ctocp(' isvol=0,ifield=0,nwhi=0,nwdi=0,idtyp=0,ipart=0,')
167 call ctocp(' itrtyp=0,nlmat=0,npar=0,ndvmx=0,numed=0,iaxis=0,')
168 call ctocp(
169 + ' ndiv=0,irot=0,ival=0,num=0,nmed=0,nbits[100],mode[6];')
170 call ctocp('G4String chnam[100];')
171 call ctocp('G4String name="",moth="",attr="",only="",shape="";')
172 call ctocp('G4String chset="",chdet="",chali="",chpar="";')
173 call ctocp('G4double amass=0.,charge=0.,tlife=0.,parval=0.;')
174 call ctocp('G4double c0=0.,step=0.,a=0.,dens=0.,radl=0.,x=0.;')
175 call ctocp('G4double y=0.,z=0.,theta1=0.,phi1=0.,theta2=0.;')
176 call ctocp('G4double phi2=0.,theta3=0.,phi3=0.,fieldm=0.;')
177 call ctocp('G4double tmaxfd=0.,stemax=0.,deemax=0.,epsil=0.;')
178 call ctocp('G4double stmin=0.,par[100],fact[100],orig[100];')
179 call ctocp('G4double bratio[6],aa[100],zz[100],wmat[100];')
180 call ctocp('nbits[0]=mode[0]=0;chnam[0]="";par[0]=0.;')
181 call ctocp('fact[0]=orig[0]=bratio[0]=aa[0]=zz[0]=wmat[0]=0.;')
182 call ctocp(' ')
183 if (nfile.eq.1) then
184* call ctocp('G3G4init();')
185 call ctocp(' ')
186 endif
187 end
188
189 subroutine g3main
190************************************************************************
191************************************************************************
192 implicit none
193#include "G3toG4.inc"
194 integer i
195*
196 close(luncode)
197 open(unit=luncode,file='G3toG4code.cc',status='unknown')
198 do i=1,nfile
199 write(luncode,'('' void G3toG4code_'',i2.2,''();'')') i
200 enddo
201 call ctocp('void G3toG4code()')
202 call ctocp('{')
203 do i=1,nfile
204 write(luncode,'('' G3toG4code_'',i2.2,''();'')') i
205 enddo
206 call ctocp('}')
207 close(luncode)
208 end
209
210 subroutine g3context(cntxt)
211************************************************************************
212*
213* g3context
214*
215* Set the current geometry code context. eg. context can be used
216* to distinguish code for different subdetectors. The Geant4
217* call list interpreter can then execute the code selectively for
218* a particular context only, if desired. Spaces not allowed.
219*
220************************************************************************
221 implicit none
222 character*(*) cntxt
223#include "G3toG4.inc"
224 context = cntxt
225 end
226*
227 subroutine ctocp(string)
228************************************************************************
229************************************************************************
230 implicit none
231 character*(*) string
232#include "G3toG4.inc"
233 write (luncode,*) string
234 end
235*
236 subroutine rtocp(string,x)
237************************************************************************
238************************************************************************
239 implicit none
240 character*(*) string
241 real x
242#include "G3toG4.inc"
243 write(luncode,'(4x,a,'' = '',e14.8,'';'')')
244 + string, x
245 end
246*
247 subroutine artocp(string,ax,n)
248************************************************************************
249************************************************************************
250 implicit none
251 character*(*) string
252 real ax(*)
253 integer n,i
254#include "G3toG4.inc"
255 do i=1,n
256 write(luncode,'('' '',a,''['',i3,''] = '',e14.8,'';'')')
257 + string, i-1, ax(i)
258 enddo
259 end
260*
261 subroutine aitocp(string,ai,n)
262************************************************************************
263************************************************************************
264 implicit none
265 character*(*) string
266 integer ai(*)
267 integer n,i
268#include "G3toG4.inc"
269 do i=1,n
270 write(luncode,'('' '',a,''['',i3,''] = '',i10,'';'')')
271 + string, i-1, ai(i)
272 enddo
273 end
274*
275 subroutine astocp(string,ac,n)
276************************************************************************
277************************************************************************
278 implicit none
279 character*(*) string, ac(*)
280 integer n,i
281#include "G3toG4.inc"
282c write(luncode,'('' G4String '',a,''['',i3,''];'')') string, n
283 do i=1,n
284 write(luncode,'('' '',a,''['',i3,''] = "'',a,''";'')')
285 + string, i-1, ac(i)
286 enddo
287 end
288*
289 subroutine g3ldpar(par,npar)
290************************************************************************
291*
292* g3ldpar
293*
294************************************************************************
295 implicit none
296*
297 integer npar, i
298 real par(*)
299#include "G3toG4.inc"
300*
301 if (npar.gt.0) then
302 write(luncode,'('' par['',i4,''] = '',e14.8,'';'')')
303 + (i-1,par(i),i=1,npar)
304 endif
305 end
306*
307 subroutine check_lines
308************************************************************************
309************************************************************************
310 implicit none
311#include "G3toG4.inc"
312 if (luncode.ne.0) then
313 nlines = nlines +1
314 if (nlines.gt.maxlines) then
315 nfile = nfile +1
316 call g3source
317 nlines = 0
318 endif
319 endif
320 end
Note: See TracBrowser for help on using the repository browser.