⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cal_fmmanalyticalintegral.c

📁 cfd求解器使用与gmsh网格的求解
💻 C
字号:
#define RCSID "$Id: Cal_FMMAnalyticalIntegral.c,v 1.10 2006/02/26 00:42:53 geuzaine Exp $"/* * Copyright (C) 1997-2006 P. Dular, C. Geuzaine * * 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. * * Please report all bugs and problems to <getdp@geuz.org>. * * Contributor(s): *   Ruth Sabariego */#include "GetDP.h"#include "CurrentData.h"#include "Numeric.h"#include "Tools.h"#include "Cal_FMMAnalyticalIntegral.h"void GF_FMMLaplacexForm( struct Element           * Element, 			 struct QuantityStorage   * QuantityStorage_P,			 int                        Nbr_Dof, 			 void                       (*xFunctionBF) (), List_T *NumDof_L,			 struct Value                Val,			 double                   ** M ){  int      i, j, id, NbrDir ;  double   xs[MAX_NODES], ys[MAX_NODES] ;  double   r0, phi0=0., r1, phi1=0., p0, p1, d, phi=0., cphi, sphi, Re, Im, cte=0., R=0. ;  double   ValRe = 1., ValIm = 0., Re2, Im2 ;  GetDP_Begin("GF_FMMLaplacexForm");  NbrDir = Current.FMM.N ;  /* Watch out: Only SCALAR ctes are considered */    if (Val.Type == SCALAR){    ValRe = Val.Val[0];    ValIm = Val.Val[MAX_DIM];  }  switch ( _2D ) {  case _2D :     switch (Element->ElementSource->Type) {    case LINE:      xs[0] = Element->ElementSource->x[0] ; ys[0] = Element->ElementSource->y[0] ;      xs[1] = Element->ElementSource->x[1] ; ys[1] = Element->ElementSource->y[1] ;            d = sqrt(SQU(xs[0]-xs[1]) + SQU(ys[0]-ys[1])) ;      r0 = sqrt(SQU(xs[0]-Current.FMM.Xgc) + SQU(ys[0]-Current.FMM.Ygc)) ;      r1 = sqrt(SQU(xs[1]-Current.FMM.Xgc) + SQU(ys[1] -Current.FMM.Ygc)) ;      switch (Current.FMM.Flag_GF) {      case FMM_AGGREGATION :	if(!Current.FMM.Flag_Normal){	  phi = atan2(ys[1]-ys[0], xs[1]-xs[0]) ;	  phi0 = atan2(ys[0] - Current.FMM.Ygc, xs[0] - Current.FMM.Xgc) ;    	  phi1 = atan2(ys[1] - Current.FMM.Ygc, xs[1] - Current.FMM.Xgc) ; 	}	else{	  /* Watch out: the analytical integration with NPxGradLaplace 	     is solo posible for Aggregation */	  phi = atan2(-ys[1]+ys[0], -xs[1]+xs[0]) ;	  phi0 = atan2(-ys[0] + Current.FMM.Ygc, -xs[0] + Current.FMM.Xgc) ;    	  phi1 = atan2(-ys[1] + Current.FMM.Ygc, -xs[1] + Current.FMM.Xgc) ; 	}	cte = -ONE_OVER_TWO_PI ;	R = Current.FMM.Rsrc ;	break;      case FMM_DISAGGREGATION :	phi = atan2(-ys[1]+ys[0], -xs[1]+xs[0]) ;	phi0 = atan2(-ys[0] + Current.FMM.Ygc, -xs[0] + Current.FMM.Xgc) ;    	phi1 = atan2(-ys[1] + Current.FMM.Ygc, -xs[1] + Current.FMM.Xgc) ; 	cte = 1. ;	R = Current.FMM.Robs ;	break;      }      cphi = cos(phi) ;      sphi = sin(phi) ;            for (j = 0 ; j < Nbr_Dof ; j++) {	if(QuantityStorage_P->BasisFunction[j].Dof->Type == DOF_UNKNOWN){	  i = List_ISearch(NumDof_L, 			   &QuantityStorage_P->BasisFunction[j].Dof->Case.Unknown.NumDof,			   fcmp_int) ;	  if (i != -1){	    p0 = p1 = cte*R/d ;	    for (id = 0 ; id < NbrDir ; id++){	      p0 *= r0/R ;	      p1 *= r1/R ;	      Re = (p1 * cos((id+1)*phi1) - p0 * cos((id+1)*phi0))/(id+1);	      Im = (p1 * sin((id+1)*phi1) - p0 * sin((id+1)*phi0))/(id+1);	      Re2 = Re * ValRe - Im * ValIm ;	      Im2 = Re * ValIm + Im * ValRe ;  	      M[i][2*id  ] =  Re2*cphi + Im2*sphi ;	      M[i][2*id+1] = -Re2*sphi + Im2*cphi ;	    }	  }	  else  Msg(GERROR, "Wrong NumDof %d for Analytical Aggreg", 		    QuantityStorage_P->BasisFunction[j].Dof->Case.Unknown.NumDof) ;	}      }       break;    default:      Msg(GERROR, "Element not implemented for Analytical Aggreg") ;    }/* Element type */    break;  default:    Msg(GERROR, "Wrong dimension for Analytical Aggreg") ;  }    GetDP_End;  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -