00001
00002
00003
00004
00005 #include <stdlib.h>
00006 #include <string.h>
00007 #include "charm++.h"
00008 #include "pup.h"
00009 #include "netfem_data.h"
00010 #include "pup_toNetwork4.h"
00011
00012 void *pack(NetFEM_update &u,int *len)
00013 {
00014
00015 int respLen;
00016 {PUP_toNetwork4_sizer p; u.pup(p); respLen=p.size();}
00017
00018 void *respBuf=malloc(respLen);
00019 {PUP_toNetwork4_pack p(respBuf); u.pup(p); }
00020 *len=respLen;
00021 return respBuf;
00022 }
00023
00024 void unpack(NetFEM_update &u,const void *buf,int bufLen)
00025 {
00026 PUP_toNetwork4_unpack p(buf);
00027 u.pup(p);
00028 }
00029
00030 void CkShortStr::copyFrom(const char *s,int len)
00031 {
00032 if (len>=maxLen) {
00033 CkPrintf("[%d] NetFEM passed bad %d-character name '%s'!\n",
00034 CkMyPe(),strlen(s),s);
00035 CkAbort("Name passed to NetFEM is too long!");
00036 }
00037 strncpy(store,s,maxLen);
00038 store[len]=0;
00039 terminate();
00040 }
00041
00042 void NetFEM_doubleField::pup(PUP::er &p) {
00043 int version=1; p(version);
00044 p(isSpatial);
00045 p(n);
00046 name.pup(p);
00047 p(fmt.vec_len);
00048 if (p.isUnpacking()) {
00049 fmt=NetFEM_format(fmt.vec_len);
00050 allocate();
00051 p(start,n*fmt.vec_len);
00052 }
00053 else {
00054 if ((!isHeapAllocated) &&
00055 (fmt.distance!=(int)(fmt.vec_len*sizeof(double))))
00056 copy();
00057 p(fmt.forItem(start,0),n*fmt.vec_len);
00058 }
00059 }
00060
00061
00062 void NetFEM_doubleField::copy(void) {
00063 if (isHeapAllocated)
00064 return;
00065 int vl=fmt.vec_len;
00066 const double *src=start;
00067
00068 allocate();
00069 for (int i=0;i<n;i++) {
00070 const double *isrc=fmt.forItem(src,i);
00071 for (int j=0;j<vl;j++)
00072 start[i*vl+j]=isrc[j];
00073 }
00074
00075 fmt=NetFEM_format(vl);
00076 }
00077
00078 NetFEM_item::~NetFEM_item() {
00079
00080 }
00081
00082 void NetFEM_item::add(double *start,const NetFEM_format &fmt,
00083 const char *name, bool isSpatialVector)
00084 {
00085 NetFEM_doubleField &f=fields[nFields++];
00086 if (nFields>maxFields)
00087 CkAbort("NetFEM: Added too many scalar or vector fields!\n");
00088 f.n=n;
00089 f.start=start;
00090 f.fmt=fmt;
00091 f.name=name;
00092 f.isSpatial=isSpatialVector;
00093 }
00094 void NetFEM_item::copy(void) {
00095 for (int i=0;i<nFields;i++)
00096 fields[i].copy();
00097 }
00098 void NetFEM_item::pup(PUP::er &p) {
00099 int version=1; p(version);
00100 p(n);
00101 p(nFields);
00102 for (int i=0;i<nFields;i++)
00103 fields[i].pup(p);
00104 }
00105
00106 void NetFEM_elems::localCopy(void) {
00107
00108 if (isHeapAllocated) return;
00109 const int *src=conn;
00110
00111 allocate();
00112 for (int i=0;i<getItems();i++)
00113 for (int j=0;j<nodesPer;j++)
00114 conn[i*nodesPer+j]=CkShiftPointer(src,i*bytesPer)[j]-idxBase;
00115 idxBase=0;
00116 }
00117 void NetFEM_elems::copy(void) {
00118 super::copy();
00119 localCopy();
00120 }
00121 void NetFEM_elems::pup(PUP::er &p) {
00122 int version=1; p(version);
00123 name.pup(p);
00124 super::pup(p);
00125 p(nodesPer);
00126 if (p.isUnpacking()) {
00127 allocate();
00128 bytesPer=nodesPer*sizeof(int);
00129 }
00130 else
00131 localCopy();
00132 p(conn,getItems()*nodesPer);
00133 }
00134
00135 void NetFEM_update::addNodes(NetFEM_nodes *n) {
00136 if (nodes!=NULL)
00137 CmiAbort("Can only call NetFEM_Nodes once per begin/end!");
00138 nodes=n;
00139 cur=n;
00140 }
00141
00142 void NetFEM_update::addElems(NetFEM_elems *n) {
00143 if (nElems>=maxElems)
00144 CmiAbort("Called NetFEM_Elements too many times!");
00145 elems[nElems++]=n;
00146 cur=n;
00147 }
00148
00149 NetFEM_item *NetFEM_update::getItem(void) {
00150 if (cur==NULL) CmiAbort("You must call NetFEM_Nodes or NetFEM_Elements before NetFEM_Scalar or NetFEM_Vector!");
00151 return cur;
00152 }
00153
00154 void NetFEM_update::pup(PUP::er &p) {
00155 int version=2; p(version);
00156 if (version>=2) p(source);
00157 p(timestep);
00158 p(dim);
00159
00160 if (nodes==NULL) {
00161 if (!p.isUnpacking()) CmiAbort("You forgot to call NetFEM_Nodes!");
00162 else nodes=new NetFEM_nodes;
00163 }
00164 nodes->pup(p);
00165
00166 p(nElems);
00167 for (int i=0;i<nElems;i++) {
00168 if (p.isUnpacking()) elems[i]=new NetFEM_elems;
00169 elems[i]->pup(p);
00170 }
00171 }
00172