src/chafe.cpp
author Alexey Ozeritsky <aozeritsky@gmail.com>
Fri Jun 11 21:50:18 2010 +0400 (20 months ago)
changeset 142 2aa3b89e9ccc
parent 1177ede4761bf23
permissions -rw-r--r--
fix
     1 /* Copyright (c) 2010 Alexey Ozeritsky
     2  * All rights reserved.
     3  *
     4  * Redistribution and use in source and binary forms, with or without
     5  * modification, are permitted provided that the following conditions
     6  * are met:
     7  * 1. Redistributions of source code must retain the above copyright
     8  *    notice, this list of conditions and the following disclaimer.
     9  * 2. Redistributions in binary form must reproduce the above copyright
    10  *    notice, this list of conditions and the following disclaimer in the
    11  *    documentation and/or other materials provided with the distribution.
    12  * 3. The name of the author may not be used to endorse or promote products
    13  *    derived from this software without specific prior written permission
    14  *
    15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
    16  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
    17  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
    18  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
    19  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
    20  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
    24  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    25  */
    26 
    27 #include <math.h>
    28 
    29 #include "chafe.h"
    30 #include "linal.h"
    31 
    32 using namespace linal;
    33 
    34 SphereChafe::SphereChafe(const SphereChafeConf & conf)
    35 	: conf(conf), op(conf.nlat, conf.nlon, 0), lapl(op)
    36 {
    37 }
    38 
    39 void SphereChafe::calc(double * out, const double * u, double t)
    40 {
    41 	double tau   = conf.tau;
    42 	double mu    = conf.mu;
    43 	double sigma = conf.sigma;
    44 	double theta = conf.theta;
    45 	long nlat    = conf.nlat;
    46 	long nlon    = conf.nlon;
    47 	long n       = nlat * nlon;
    48 
    49 	double dlat = M_PI / (nlat-1);
    50 	double dlon = 2. * M_PI /nlon;
    51 
    52 	array_t delta_u(n);
    53 	array_t rp(n);
    54 
    55 	lapl.calc(&delta_u[0], &u[0]);
    56 	// u/dt + (1-\theta) mu \Delta u - (1-\theta) \sigma u
    57 	vec_sum1(&rp[0], &u[0], &delta_u[0], 1.0 / tau - (1-theta) * sigma, mu * (1-theta), n);
    58 
    59 	// u/dt + (1-\theta) mu \Delta u / 2 - (1-\theta) \sigma u / 2 + f
    60 	for (int i = 0; i < nlat; i++) {
    61 		double phi    = -0.5 * M_PI + i * dlat;
    62 		for (int j = 0; j < nlon; ++j) {
    63 			double lambda = j * dlon;
    64 			if (conf.rp) {
    65 				rp[i * nlon + j] += conf.rp(phi, lambda, t, mu, sigma);
    66 			}
    67 		}
    68 	}
    69 
    70 	if (theta == 0) {
    71 		vec_mult_scalar(out, &rp[0], tau, n);
    72 	} else {
    73 		// u'/dt - \theta mu \Delta u' + \theta \sigma u'
    74 		lapl.solve(out, &rp[0], -theta * mu, 1.0 / tau + theta * sigma);
    75 	}
    76 }
    77