Code indexing in gitaly is broken and leads to code not being visible to the user. We work on the issue with highest priority.

Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
convert_to_f90.py 3.24 KiB
#!/usr/bin/env python
import re

filenames = [
    "CTOSAC" , "CTOSAD" , "CTOSBC" , 
    "CTTBAC" , "CTTBAD" , "CTTBBC" ,
    "T1BOXAC", "T1BOXAD", "T1BOXBC",
    "T1BUBAC", "T1BUBAD", "T1BUBBC",
    "T1TRIAC", "T1TRIAD", "T1TRIBC",
    "T2BOXAC", "T2BOXAD", "T2BOXBC",
    "T2TRIAC", "T2TRIAD", "T2TRIBC",
    "T3TRIAC", "T3TRIAD", "T3TRIBC",
    "T4TRIAC", "T4TRIAD", "T4TRIBC",
    "TLEPS0" , "TLEPS1"
]

for filename in filenames:
    with open('radiative/%s.F' % filename) as fp:
        F = fp.read()

    # Remove c comments with ! comments
    reg = re.compile("^[cC]", re.M)
    f90 = reg.sub('!', F)

    # Change line continuation character
    f90 = re.sub("\n\ \ \ \ \ [^\ ]", " & \n    ", f90)

    # Remove empty lines
    reg = re.compile("^\ *&\ *\n", re.M)
    f90 = reg.sub('', f90)
    
    # Remove the definition of pi
    f90 = f90.replace("np2,np3,np4,Pi,mu2,", "np2,np3,np4,mu2,")
    f90 = re.sub("[\ \t]+PI\ *=dacos\([^\)]*\)", "", f90)

    # Add import
    f90 = f90.replace("      implicit none", "      use global_def, only: pi, prec\n      implicit none")

    # Change type to prec
    f90 = f90.replace("RealType", "real(kind=prec)")
    f90 = f90.replace(".d0", "._prec")
    f90 = f90.replace("dsqrt", "sqrt")

    # Cache loop functions
    loopfcts = re.findall("([ABCD]+)0(i?)\(([^\)]*)\)",f90)
    cache = ["",""]
    fcts = {'A':[],'B':[], 'DB':[],'C':[],'D':[]}
    for f,tens,args in loopfcts:
        fcts[f].append(args)

        cache[0] += '    %scache(%d) = %s0%s(%s)\n' % (
            f, len(fcts[f]), f, tens, re.sub('[\s&]+', '', args)
        )

        f90 = f90.replace("%s0%s(%s)" % (f,tens,args), f+"cache("+str(len(fcts[f]))+")")

    for key,value in fcts.iteritems():
        if len(value) > 0:
            cache[1] += "    complex(kind=prec) :: %scache(%d)\n" % (key,len(value))
    f90 = f90.replace("      "+filename+"=",cache[0]+"\n!\n      "+filename+"=")

    # Include relevant LoopToos headers
    f90 = f90.replace("#include \"looptools.h\"", """
    complex(kind=prec) A0, B0i
    complex(kind=prec) B0
    complex(kind=prec) DB0
    complex(kind=prec) C0, C0i
    complex(kind=prec) D0, D0i

    integer, parameter :: bb0  = 1
    integer, parameter :: bb1  = 4
    integer, parameter :: cc0  = 1
    integer, parameter :: cc1  = 4
    integer, parameter :: cc2  = 7
    integer, parameter :: cc00 = 10
    integer, parameter :: cc11 = 13
    integer, parameter :: cc12 = 16
    integer, parameter :: cc22 = 19
    integer, parameter :: dd0  = 1
    integer, parameter :: dd1  = 4
    integer, parameter :: dd2  = 7
    integer, parameter :: dd3  = 10
    integer, parameter :: dd00 = 13
    
    

    external A0, B0i
    external B0
    external DB0
    external C0, C0i
    external D0, D0i
    """+"\n"+cache[1])

    # Rename function end
    f90 = f90.replace("end", "end function")
    
    # Add module header
    f90 = """
                          !!!!!!!!!!!!!!!!!!!!!!
                              MODULE rad_%s
                          !!!!!!!!!!!!!!!!!!!!!!
  contains
%s
                          !!!!!!!!!!!!!!!!!!!!!!
                            END MODULE rad_%s
                          !!!!!!!!!!!!!!!!!!!!!!
""" % (filename, f90, filename) 

    with open('radiative/%s.f95' % filename, 'w') as fp:
        fp.write(f90)