00001 #include <stdio.h>
00002 #include <stdlib.h>
00003 #include <math.h>
00004 #include "seismtool.h"
00005 #include "global.h"
00006 #include "node.h"
00007
00008 seismtool::seismtool (void)
00009 {
00010 nsac=0;
00011
00012 direction = NULL;
00013 seism = NULL;
00014 gf = NULL;
00015 }
00016
00017 seismtool::~seismtool (void)
00018 {
00019 delete [] direction;
00020 delete [] seism;
00021 delete [] gf;
00022 }
00023
00024
00025
00026
00027
00028
00029
00030
00031 void seismtool::read (XFILE *in)
00032 {
00033 long i,j;
00034
00035
00036 xfscanf (in,"%ld",&nsac);
00037
00038 direction = new dirdynload [nsac];
00039
00040
00041 gf = new gfunct [nsac];
00042 for (i=0;i<nsac;i++){
00043 xfscanf (in,"%m", &dirdynload_kwdset, (int*)&direction[i]);
00044 }
00045
00046 xfscanf (in,"%ld",&j);
00047 if (j==0){
00048 for (i=0;i<nsac;i++){
00049 gf[i].read (in);
00050 }
00051 }
00052 if (j==1){
00053 char name[1001];
00054 XFILE *accelin;
00055 xfscanf(in, " %1000a", name);
00056
00057
00058 accelin = xfopen (name,"r");
00059
00060 accelin->warning = 1;
00061 accelin->kwdmode = ignore;
00062
00063 accelin->ignorecase = 1;
00064
00065 for (i=0;i<nsac;i++){
00066 gf[i].read (accelin);
00067 }
00068 xfclose (accelin);
00069 }
00070
00071
00072 seism = new double [Ndofm*nsac];
00073 nullv (seism,Ndofm*nsac);
00074
00075 seisminit (seism);
00076
00077
00078 }
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088 void seismtool::seisminit (double *seism)
00089 {
00090 long i,j,k,n,ndofn,m,*cn;
00091
00092 n=Ndofm;
00093
00094 Mt->alloc_meaning ();
00095
00096 Mt->define_meaning ();
00097
00098
00099 for (i=0;i<Mt->nn;i++){
00100
00101 ndofn = Mt->give_ndofn (i);
00102 cn = new long [ndofn];
00103
00104 Mt->give_node_code_numbers (i,cn);
00105
00106
00107 for (j=0;j<ndofn;j++){
00108
00109 m = Mt->nodes[i].meaning[j];
00110 if (cn[j]>0){
00111 for (k=0;k<nsac;k++){
00112 if (m == direction[k])
00113 seism[n*k+cn[j]-1]=1.0;
00114 }
00115 }
00116 }
00117
00118 delete [] cn;
00119 }
00120
00121 }
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131 void seismtool::assemble (double *rhs,double time)
00132 {
00133 long i,j,n;
00134 double a,*aux;
00135
00136 n=Ndofm;
00137
00138 aux = new double [n];
00139
00140 for (i=0;i<nsac;i++){
00141 nullv (aux,n);
00142
00143 copyv (seism+i*n,aux,n);
00144
00145
00146 a=gf[i].getval(time);
00147
00148
00149
00150 for (j=0;j<n;j++){
00151 rhs[j]-=a*aux[j];
00152 }
00153 }
00154
00155 delete [] aux;
00156 }
00157