void CartBlock::insertInDonorList(int senderid,int index,int meshtagdonor,int remoteid,double cellRes) { DONORLIST *temp1; int ijklmn[6]; int pointid; temp1=(DONORLIST *)malloc(sizeof(DONORLIST)); amr_index_to_ijklmn(pdegree,dims[0],dims[1],dims[2],nf,qstride,index,ijklmn); //pointid=ijklmn[5]*(pdegree+1)*(pdegree+1)*d3+ // ijklmn[4]*(pdegree+1)*d3+ // ijklmn[3]*d3+ // ijklmn[2]*d2+ // ijklmn[1]*d1+ // ijklmn[0]; pointid=(ijklmn[2]*d2+ijklmn[1]*d1+ijklmn[0])*p3+ ijklmn[5]*(pdegree+1)*(pdegree+1)+ ijklmn[4]*(pdegree+1)+ijklmn[3]; if (!(pointid >= 0 && pointid < ndof)) { tracei(index); tracei(nf); tracei(pdegree); tracei(dims[0]); tracei(dims[1]); tracei(dims[2]); tracei(qstride); printf("%d %d %d %d %d %d\n",ijklmn[0],ijklmn[1],ijklmn[2], ijklmn[3],ijklmn[4],ijklmn[5]); } assert((pointid >= 0 && pointid < ndof)); temp1->donorData[0]=senderid; temp1->donorData[1]=meshtagdonor; temp1->donorData[2]=remoteid; temp1->donorRes=cellRes; temp1->cancel=0; insertInList(&(donorList[pointid]),temp1); }
void tioga::dataUpdate_AMR(int nvar,double *q,int interptype) { int i,j,k,m; int nints; int nreals; int *integerRecords; double *realRecords; int nsend,nrecv; int *sndMap,*rcvMap; PACKET *sndPack,*rcvPack; int *icount,*dcount; int bid; // // initialize send and recv packets // icount=dcount=NULL; integerRecords=NULL; realRecords=NULL; // pc_cart->getMap(&nsend,&nrecv,&sndMap,&rcvMap); if (nsend==0) return; sndPack=(PACKET *)malloc(sizeof(PACKET)*nsend); rcvPack=(PACKET *)malloc(sizeof(PACKET)*nrecv); icount=(int *)malloc(sizeof(int)*nsend); dcount=(int *)malloc(sizeof(int)*nrecv); // pc_cart->initPackets(sndPack,rcvPack); // // get the interpolated solution now // integerRecords=NULL; realRecords=NULL; mb->getInterpolatedSolutionAMR(&nints,&nreals,&integerRecords,&realRecords,q,nvar,interptype); for(i=0;i<ncart;i++) cb[i].getInterpolatedData(&nints,&nreals,&integerRecords,&realRecords,nvar); // // populate the packets // for(i=0;i<nints;i++) { k=integerRecords[3*i]; if (k <0 || k > nsend) { tracei(nsend); tracei(i); tracei(nints); tracei(k); } assert(k < nsend); sndPack[k].nints+=2; sndPack[k].nreals+=nvar; } for(k=0;k<nsend;k++) { sndPack[k].intData=(int *)malloc(sizeof(int)*sndPack[k].nints); sndPack[k].realData=(double *)malloc(sizeof(double)*sndPack[k].nreals); icount[k]=dcount[k]=0; } m=0; for(i=0;i<nints;i++) { k=integerRecords[3*i]; sndPack[k].intData[icount[k]++]=integerRecords[3*i+1]; sndPack[k].intData[icount[k]++]=integerRecords[3*i+2]; for(j=0;j<nvar;j++) sndPack[k].realData[dcount[k]++]=realRecords[m++]; } // // communicate the data across // pc_cart->sendRecvPackets(sndPack,rcvPack); // // decode the packets and update the data // for(k=0;k<nrecv;k++) { m=0; for(i=0;i<rcvPack[k].nints/2;i++) { bid=rcvPack[k].intData[2*i]; if (bid< 0) { mb->updateSolnData(rcvPack[k].intData[2*i+1],&rcvPack[k].realData[m],q,nvar,interptype); } else { cb[bid].update(&rcvPack[k].realData[m],rcvPack[k].intData[2*i+1],nvar); m+=nvar; } } } // // release all memory // pc_cart->clearPackets2(sndPack,rcvPack); free(sndPack); free(rcvPack); if (integerRecords) free(integerRecords); if (realRecords) free(realRecords); if (icount) free(icount); if (dcount) free(dcount); }