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

Last change on this file since 1342 was 1337, checked in by garnier, 14 years ago

tag geant4.9.4 beta 1 + modifs locales

File size: 11.4 KB
Line 
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 $
28*     GEANT4 tag $Name: geant4-09-04-beta-01 $
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.