https://github.com/geodynamics/citcoms
Revision 2b8ed1fa028a0457da2a8c686072407ed5c0d930 authored by Thorsten Becker on 22 August 2012, 21:21:52 UTC, committed by Thorsten Becker on 22 August 2012, 21:21:52 UTC
"a new method of finding the element of a tracer that is too close to
an element boundary. Up to now such a tracer was shifted by a constant
epsilon theta and phi. If the element boundary is parallel to this
theta/phi direction it is not guaranteed to work well (thus the
number_of_tries check), and additionally I got the problem that
sometimes all elements refuse this tracer. Eh checked in a workaround
for this (r15742), deleting orphan tracers in Tracer_setup.c. Because
I did not know this, I created my own bugfix moving the tracers an
epsilon amount orthogonal to all boundaries that are too close. In
order to save computing time I use the already computed vectors for
the element boundaries (this assumes that the element boundaries are
nearly orthogonal to each other, but unless somebody tries to change
CitcomS elements that should work fine). The shift happens now in
cartesian coordinates since the boundary-vectors are cartesian and the
radius-coordinate of the tracer is normalized prior to this check
anyway, so I just need to re-normalize it after the shift. For now I
did not touch all the now (hopefully) useless security checks but as
far as I can see they do no harm either, so we can remove them later."



1 parent 11854a5
Raw File
Tip revision: 2b8ed1fa028a0457da2a8c686072407ed5c0d930 authored by Thorsten Becker on 22 August 2012, 21:21:52 UTC
Implemented improved tracer fix by Rene.
Tip revision: 2b8ed1f
autocombine.py
#!/usr/bin/env python
#
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
#<LicenseText>
#
# CitcomS.py by Eh Tan, Eun-seo Choi, and Pururav Thoutireddy.
# Copyright (C) 2002-2005, California Institute of Technology.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
#</LicenseText>
#
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

'''Automatically find the input parameters from CitcomS input file and run
'batchcombine.py'

usage: autocombine.py machinefile inputfile step1 [step2 [...] ]
'''

# default values for CitcomS input
defaults = {'output_format': 'ascii',
            'output_optional': 'surf,botm',
            'buoy_type': 1,
            'tracer_flavors': 2,
            'nprocx': 1,
            'nprocy': 1,
            'nprocz': 1,
            'nodex': 9,
            'nodey': 9,
            'nodez': 9}



def normalize_optional(output_optional):
    fields = []

    for opt in output_optional.split(','):
        ## remove the leading/trailing whitespaces
        opt = opt.strip()

        ## retain fields that are node-based
        if opt in ('pressure', 'stress', 'comp_nd'):
            fields.append(opt)


    return ','.join(fields)



if __name__ == '__main__':

    import sys
    import batchcombine as bc

    if len(sys.argv) < 4:
        print __doc__
        sys.exit(1)

    machinefile = sys.argv[1]
    inputfile = sys.argv[2]
    timesteps = [int(i) for i in sys.argv[3:]]

    # parse input
    from parser import Parser
    parser = Parser(defaults)
    parser.read(inputfile)

    datadir = parser.getstr('datadir')
    datafile = parser.getstr('datafile')
    output_format = parser.getstr('output_format')

    if output_format != 'ascii':
        print "Error: don't know how to combine the output", \
              "(output_format=%s)" % output_format
        sys.exit(1)

    output_optional = parser.getstr('output_optional')
    optional_fields = normalize_optional(output_optional)

    buoy_type = parser.getint('buoy_type')
    nflavors = parser.getint('tracer_flavors')
    if buoy_type == 0:
        ncompositions = nflavors
    elif buoy_type == 1:
        ncompositions = nflavors - 1
    else:
        print "Error: don't know how to combine the output", \
              "(buoy_type=%d)" % buoy_type
        sys.exit(1)



    nodex = parser.getint('nodex')
    nodey = parser.getint('nodey')
    nodez = parser.getint('nodez')
    ncap = parser.getint('nproc_surf')
    nprocx = parser.getint('nprocx')
    nprocy = parser.getint('nprocy')
    nprocz = parser.getint('nprocz')

    totalnodes = nprocx * nprocy * nprocz * ncap
    nodelist = bc.machinefile2nodelist(machinefile, totalnodes)

    for timestep in timesteps:
        # combining coord, velo, temp, and visc
        bc.batchcombine(nodelist, datadir, datafile, timestep,
                        nodex, nodey, nodez,
                        ncap, nprocx, nprocy, nprocz,
                        'coord,velo,visc', 0)

        # combining optional fields, if necessary
        if optional_fields:
            bc.batchcombine(nodelist, datadir, datafile, timestep,
                            nodex, nodey, nodez,
                            ncap, nprocx, nprocy, nprocz,
                            optional_fields, ncompositions)



# version
# $Id$

# End of file
back to top