file: Hlib/src/Memory.c
#define WORK 1
// //
// Author: T.Warburton //
// Design: T.Warburton && S.Sherwin //
// Date : 12/4/96 //
// //
// Copyright notice: This code shall not be replicated or used without //
// the permission of the author. //
// //
/**************************************************************************/
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include <polylib.h>
#include "veclib.h"
#include "hotel.h"
double *Tri_wk = (double*)0;
double *Quad_wk = (double*)0;
double *Quad_Jbwd_wk = (double*)0;
double *Quad_Iprod_wk = (double*)0;
double *Quad_Grad_wk = (double*)0;
double *Quad_HelmHoltz_wk = (double*)0;
double *Tet_wk = (double*)0;
double *Tet_form_diprod_wk = (double*)0;
double *Tet_Jbwd_wk = (double*)0;
double *Tet_Iprod_wk = (double*)0;
double *Tet_Grad_wk = (double*)0;
double *Tet_HelmHoltz_wk = (double*)0;
double *Pyr_wk = (double*)0;
double *Pyr_form_diprod_wk = (double*)0;
double *Pyr_Jbwd_wk = (double*)0;
double *Pyr_Iprod_wk = (double*)0;
double *Pyr_Grad_wk = (double*)0;
double *Pyr_HelmHoltz_wk = (double*)0;
double *Pyr_InterpToGaussFace_wk = (double*)0;
double *Prism_wk = (double*)0;
double *Prism_form_diprod_wk = (double*)0;
double *Prism_Jbwd_wk = (double*)0;
double *Prism_Iprod_wk = (double*)0;
double *Prism_Grad_wk = (double*)0;
double *Prism_HelmHoltz_wk = (double*)0;
double *Prism_InterpToGaussFace_wk = (double*)0;
double *Hex_wk = (double*)0;
double *Hex_form_diprod_wk = (double*)0;
double *Hex_Jbwd_wk = (double*)0;
double *Hex_Iprod_wk = (double*)0;
double *Hex_Grad_wk = (double*)0;
double *Hex_HelmHoltz_wk = (double*)0;
double *Hex_InterpToGaussFace_wk = (double*)0;
void Tri_work(){
if(Tri_wk)
free(Tri_wk);
Tri_wk = dvector(0,5*QGmax*QGmax-1);
}
void Quad_work(){
if(Quad_wk){
free(Quad_wk);
free(Quad_Jbwd_wk);
free(Quad_Iprod_wk);
free(Quad_Grad_wk);
free(Quad_HelmHoltz_wk);
}
int nmax = max(QGmax+2, LGmax+2);
Quad_wk = dvector(0, 2*nmax*nmax-1);
Quad_Jbwd_wk = dvector(0, 2*nmax*nmax-1);
Quad_Iprod_wk = dvector(0, 2*nmax*nmax-1);
Quad_Grad_wk = dvector(0, 2*nmax*nmax-1);
Quad_HelmHoltz_wk = dvector(0, 2*nmax*nmax-1);
}
void Tet_work(){
if(Tet_wk){
free(Tet_wk);
free(Tet_form_diprod_wk);
free(Tet_Jbwd_wk);
free(Tet_Iprod_wk);
free(Tet_Grad_wk);
free(Tet_HelmHoltz_wk);
}
Tet_wk = dvector(0, QGmax*QGmax*QGmax-1);
Tet_form_diprod_wk = dvector(0, 3*QGmax*QGmax*QGmax-1);
Tet_Jbwd_wk = dvector(0, 3*QGmax*QGmax*QGmax-1);
Tet_Iprod_wk = dvector(0, 2*QGmax*QGmax*QGmax-1);
Tet_Grad_wk = dvector(0, 3*QGmax*QGmax*QGmax-1);
Tet_HelmHoltz_wk = dvector(0, 4*QGmax*QGmax*QGmax-1);
}
void Pyr_work(){
if(Pyr_wk){
free(Pyr_wk);
free(Pyr_form_diprod_wk);
free(Pyr_Jbwd_wk);
free(Pyr_Iprod_wk);
free(Pyr_Grad_wk);
free(Pyr_HelmHoltz_wk);
free(Pyr_InterpToGaussFace_wk);
}
Pyr_wk = dvector(0, QGmax*QGmax*QGmax-1);
Pyr_form_diprod_wk = dvector(0, 3*QGmax*QGmax*QGmax-1);
Pyr_Jbwd_wk = dvector(0, 3*QGmax*QGmax*QGmax-1);
Pyr_Iprod_wk = dvector(0, QGmax*QGmax*QGmax-1);
Pyr_Grad_wk = dvector(0, 3*QGmax*QGmax*QGmax-1);
Pyr_HelmHoltz_wk = dvector(0, 4*QGmax*QGmax*QGmax-1);
Pyr_InterpToGaussFace_wk = dvector(0, QGmax*QGmax-1);
}
void Prism_work(){
if(Prism_wk){
free(Prism_wk);
free(Prism_form_diprod_wk);
free(Prism_Jbwd_wk);
free(Prism_Iprod_wk);
free(Prism_Grad_wk);
free(Prism_HelmHoltz_wk);
free(Prism_InterpToGaussFace_wk);
}
Prism_wk = dvector(0, QGmax*QGmax*QGmax-1);
Prism_form_diprod_wk = dvector(0, 3*QGmax*QGmax*QGmax-1);
Prism_Jbwd_wk = dvector(0, 3*QGmax*QGmax*QGmax-1);
Prism_Iprod_wk = dvector(0, QGmax*QGmax*QGmax-1);
Prism_Grad_wk = dvector(0, 3*QGmax*QGmax*QGmax-1);
Prism_HelmHoltz_wk = dvector(0, 4*QGmax*QGmax*QGmax-1);
Prism_InterpToGaussFace_wk = dvector(0, QGmax*QGmax-1);
}
void Hex_work(){
if(Hex_wk){
free(Hex_wk);
free(Hex_form_diprod_wk);
free(Hex_Jbwd_wk);
free(Hex_Iprod_wk);
free(Hex_Grad_wk);
free(Hex_HelmHoltz_wk);
free(Hex_InterpToGaussFace_wk);
}
Hex_wk = dvector(0, QGmax*QGmax*QGmax-1);
Hex_form_diprod_wk = dvector(0, 3*QGmax*QGmax*QGmax-1);
Hex_Jbwd_wk = dvector(0, QGmax*QGmax*QGmax-1);
Hex_Iprod_wk = dvector(0, QGmax*QGmax*QGmax-1);
Hex_Grad_wk = dvector(0, 3*QGmax*QGmax*QGmax-1);
Hex_HelmHoltz_wk = dvector(0, 4*QGmax*QGmax*QGmax-1);
Hex_InterpToGaussFace_wk = dvector(0, QGmax*QGmax-1);
}
/*
Function name: Element::Mem_Q
Function Purpose:
Function Notes:
*/
void Tri::Mem_Q(){
if(qa != lmax+1){
#ifndef COMPRESS
qa = lmax+1; qb = lmax;
#else
qa = lmax+1; qb = lmax+1;
#endif
}
qtot = qa*qb;
if(qa>QGmax)
QGmax=qa;
if(qb>QGmax)
QGmax=qb;
}
void Quad::Mem_Q(){
if(qa != lmax+1){
qa = lmax+1; qb = lmax+1;
}
qtot = qa*qb;
if(qa>QGmax)
QGmax=qa;
if(qb>QGmax)
QGmax=qb;
}
void Tet::Mem_Q(){
int lm;
#ifdef COMPRESS
if(qa != (lm=lmax+1)){
qa = lm; qb = lm; qc = lm; qtot = qa*qb*qc;
}
#else
if(qa != (lm=lmax+1)){
qa = lm; qb = lm-1; qc = lm-1; qtot = qa*qb*qc;
}
#endif
if(qa>QGmax)
QGmax=qa;
if(qb>QGmax)
QGmax=qb;
if(qc>QGmax)
QGmax=qc;
}
void Pyr::Mem_Q(){
qb = qa = lmax+1;
qc = lmax;
QGmax = max(qa, QGmax);
}
void Prism::Mem_Q(){
#ifdef COMPRESS
int lm;
if(qa != (lm=lmax+1)){
qa = lm; qb = lm; qc = lm; qtot = qa*qb*qc;
}
#else
qb = qa = lmax+1;
qc = lmax;
qtot = qa*qb*qc;
#endif
QGmax = max(qa, QGmax);
}
void Hex::Mem_Q(){
qc = qb = qa = lmax+1;
QGmax = max(qa, QGmax);
}
void Element::Mem_Q(){ERR;} //OVERLOAD CALL: ERR: Element.c(?), hotel.h(?)
/*
Function name: Element::Mem_J
Function Purpose:
Argument 1: int *list
Purpose:
Argument 2: char
Purpose:
Function Notes:
*/
void Tri::Mem_J(int *list, char )
{
register int i;
int ndata,nbl;
/* check to see if any 'l' values are different */
/* also recalculate new vector length */ //OVERLOAD CALL: vector: Coords.c(?), Curvi.c(?)
nbl = Nverts;
for(i = 0; i < Nedges; ++i)
nbl += list[i];
ndata = nbl;
ndata += list[i]*(list[i]+1)/2;
Nmodes = ndata;
Nbmodes = nbl;
for(i = 0; i < Nedges; ++i)
edge[i].l = list[i];
face[0].l = list[i];
lmax = 0;
// if(interior_l) lmax = interior_l+4;
for(i = 0; i < Nedges; ++i) lmax = max(lmax,edge[i].l+2);
#ifndef COMPRESS
for(i = 0; i < Nfaces; ++i)
if(face[i].l) lmax = max(lmax,face[i].l+3);
#else
for(i = 0; i < Nfaces; ++i)
if(face[i].l) lmax = max(lmax,face[i].l+3);
#endif
LGmax= (lmax > LGmax) ? lmax:LGmax;
}
void Quad::Mem_J(int *list, char )
{
register int i;
int ndata,nbl;
/* check to see if any 'l' values are different */
/* also recalculate new vector length */ //OVERLOAD CALL: vector: Coords.c(?), Curvi.c(?)
nbl = Nverts;
for(i = 0; i < Nedges; ++i)
nbl += list[i];
ndata = nbl;
ndata += list[i]*list[i];
Nmodes = ndata;
Nbmodes = nbl;
for(i = 0; i < Nedges; ++i)
edge[i].l = list[i];
face[0].l = list[i];
lmax = 0;
// if(interior_l) lmax = interior_l+4;
for(i = 0; i < Nedges; ++i) lmax = max(lmax,edge[i].l+2);
for(i = 0; i < Nfaces; ++i)
if(face[i].l) lmax = max(lmax,face[i].l+2);
LGmax = (lmax>LGmax) ? lmax:LGmax;
}
void Tet::Mem_J(int *list, char ){
int i, cnt=0, l,nfv;
Nbmodes = Nverts;
for(i=0;i<Nedges;++i,++cnt){
l = list[cnt];
edge[i].l = l;
Nbmodes += l;
lmax = max(lmax, l+2);
}
for(i=0;i<Nfaces;++i,++cnt){
l = list[cnt];
face[i].l = l;
if(l){
nfv = Nfverts(i); //OVERLOAD CALL: Nfverts: Nums.c(Tri), Nums.c(Quad), Nums.c(Tet), Nums.c(Pyr), Nums.c(Prism), Nums.c(Hex), Nums.c(Element)
Nbmodes += (nfv == 3) ? l*(l+1)/2:l*l;
lmax = max(lmax, (nfv == 3) ? l+3:l+2);
}
}
l = list[cnt];
if(l)
lmax = max(lmax, l+3);
interior_l = l;
// needs to be fixed
Nmodes = Nbmodes + l*(l+1)*(l+2)/6;
LGmax= max(lmax, LGmax);
}
void Pyr::Mem_J(int *list, char ){
int i, cnt=0, l,nfv;
Nbmodes = NPyr_verts;
for(i=0;i<NPyr_edges;++i,++cnt){
l = list[cnt];
edge[i].l = l;
Nbmodes += l;
lmax = max(lmax, l+2);
}
for(i=0;i<NPyr_faces;++i,++cnt){
l = list[cnt];
face[i].l = l;
if(l){
nfv = Nfverts(i); //OVERLOAD CALL: Nfverts: Nums.c(Tri), Nums.c(Quad), Nums.c(Tet), Nums.c(Pyr), Nums.c(Prism), Nums.c(Hex), Nums.c(Element)
Nbmodes += (nfv == 3) ? l*(l+1)/2:l*l;
lmax = max(lmax, (nfv == 3) ? l+3:l+2);
}
}
l = list[cnt];
if(l)
lmax = max(lmax, l+3);
interior_l = l;
// needs to be fixed
Nmodes = Nbmodes + l*(l+1)*(l+2)/6;
LGmax= max(lmax, LGmax);
}
void Prism::Mem_J(int *list, char ){
int i, cnt=0, l,nfv;
Nbmodes = NPrism_verts;
for(i=0;i<NPrism_edges;++i,++cnt){
l = list[cnt];
edge[i].l = l;
Nbmodes += l;
lmax = max(lmax, l+2);
}
for(i=0;i<NPrism_faces;++i,++cnt){
l = list[cnt];
face[i].l = l;
if(l){
nfv = Nfverts(i); //OVERLOAD CALL: Nfverts: Nums.c(Tri), Nums.c(Quad), Nums.c(Tet), Nums.c(Pyr), Nums.c(Prism), Nums.c(Hex), Nums.c(Element)
Nbmodes += (nfv == 3) ? l*(l+1)/2:l*l;
lmax = max(lmax, (nfv == 3) ? l+3:l+2);
}
}
l = list[cnt];
if(l)
lmax = max(lmax, l+2);
interior_l = l;
// needs to be fixed
Nmodes = Nbmodes + (l-1)*l*l/2;
LGmax= max(lmax, LGmax);
}
void Hex::Mem_J(int *list, char ){
int i, cnt=0, l;
Nbmodes = NHex_verts;
for(i=0;i<NHex_edges;++i,++cnt){
l = list[cnt];
edge[i].l = l;
Nbmodes += l;
lmax = max(lmax, l+2);
}
for(i=0;i<NHex_faces;++i,++cnt){
l = list[cnt];
face[i].l = l;
if(l){
Nbmodes += l*l;
lmax = max(lmax, l+2);
}
}
l = list[cnt];
if(l)
lmax = max(lmax, l+2);
interior_l = l;
Nmodes = Nbmodes + l*l*l;
LGmax= max(lmax,LGmax);
}
void Element::Mem_J(int *, char){ERR;} //OVERLOAD CALL: ERR: Element.c(?), hotel.h(?)
/*
Function name: Element::Mem_free
Function Purpose:
Function Notes:
*/
void Tri::Mem_free(){
if(h)
free_dmatrix(h,0,0);
if(vert[0].hj)
free(vert[0].hj);
}
void Quad::Mem_free(){
if(h)
free(*h);
if(vert[0].hj)
free(vert[0].hj);
}
void Tet::Mem_free(){
if(h)
free_dmatrix(h,0,0);
if(h_3d)
free_dtarray(h_3d,0,0,0);
if(vert[0].hj)
free(vert[0].hj);
}
void Pyr::Mem_free(){
if(h)
free_dmatrix(h,0,0);
if(h_3d)
free_dtarray(h_3d,0,0,0);
if(vert[0].hj)
free(vert[0].hj);
}
void Prism::Mem_free(){
if(h)
free_dmatrix(h,0,0);
if(h_3d)
free_dtarray(h_3d,0,0,0);
if(vert[0].hj)
free(vert[0].hj);
}
void Hex::Mem_free(){
if(h)
free_dmatrix(h,0,0);
if(h_3d)
free_dtarray(h_3d,0,0,0);
if(vert[0].hj)
free(vert[0].hj);
}
void Element::Mem_free(){ERR;} //OVERLOAD CALL: ERR: Element.c(?), hotel.h(?)
/*
Function name: Element::Mem_shift
Function Purpose:
Argument 1: double *new_h
Purpose:
Argument 2: double *new_hj
Purpose:
Argument 3: char Trip
Purpose:
Function Notes:
*/
void Tri::Mem_shift(double *new_h, double *new_hj, char Trip){
h = (double**) calloc(qb,sizeof(double*));
face[0].hj = (double**) calloc(face[0].l,sizeof(double*));
// Physical memory
int i;
for(i = 0; i < qb; ++i)
h[i] = new_h+i*qa;
// Modal Memory
for(i = 0; i < Nverts; ++i, ++new_hj)
vert[i].hj = new_hj;
for(i = 0; i < Nedges; ++i){
edge[i].hj = new_hj;
new_hj += edge[i].l;
}
for(i = 0; i < face[0].l; ++i){
face[0].hj[i] = new_hj;
new_hj += face[0].l-i;
}
}
void Quad::Mem_shift(double *new_h, double *new_hj, char ){
h = (double**) malloc(qb*sizeof(double*));
face[0].hj = (double**) malloc(face[0].l*sizeof(double*));
// Physical memory
int i;
for(i = 0; i < qb; ++i)
h[i] = new_h+i*qa;
for(i = 0; i < Nverts; ++i, ++new_hj)
vert[i].hj = new_hj;
for(i = 0; i < Nedges; ++i){
edge[i].hj = new_hj;
new_hj += edge[i].l;
}
for(i = 0; i < face[0].l; ++i){
face[0].hj[i] = new_hj;
new_hj += face[0].l;
}
}
void Tet::Mem_shift(double *new_h, double *new_hj, char trip){
// Physical memory
register int i,j,ll;
int totbc,totc;
int skipa,skipb;
totbc = qb*qa;
totc = qc;
h_3d = (double ***) malloc(totc*sizeof(double **));
h_3d[0] = (double **) malloc(totbc*sizeof(double *));
h_3d[0][0] = new_h;
skipa = skipb = 0;
for(i = 0; i < qc; ++i, skipb += qb){
h_3d[i] = h_3d[0] + skipb;
for(j = 0; j < qb; ++j, skipa += qa)
h_3d[i][j] = h_3d[0][0] + skipa;
}
// Modal memory
for(i = 0; i < Nverts; ++i, ++new_hj)
vert[i].hj = new_hj;
for(i = 0; i < Nedges; ++i){
edge[i].hj = new_hj;
new_hj += edge[i].l;
}
double *p = new_hj;
for(i = 0; i < Nfaces; ++i)
if (ll=face[i].l){
face[i].hj = (double **)malloc(ll*sizeof(double *));
for(j = 0; j < ll; p+=ll-j, ++j)
face[i].hj[j] = p;
}
else face[i].hj = (double **)malloc(sizeof(double *));
// interior modes
if(interior_l){
hj_3d = (double ***)malloc(interior_l*sizeof(double**));
double **p1;
p1 = (double **)malloc((interior_l*(interior_l+1)/2)*sizeof(double *));
for(i = 0; i < interior_l;p1+=interior_l-i,++i){
hj_3d[i] = p1;
for(j = 0; j < interior_l-i;p+=interior_l-i-j,++j)
hj_3d[i][j] = p;
}
}
}
void Pyr::Mem_shift(double *new_h, double *new_hj, char trip){
// Physical memory
register int i,j,ll;
int skipa,skipb;
h_3d = (double ***) malloc(qc*sizeof(double **));
h_3d[0] = (double **) malloc(qc*qb*sizeof(double *));
h_3d[0][0] = new_h;
skipa = skipb = 0;
for(i = 0; i < qc; ++i, skipb += qb){
h_3d[i] = h_3d[0] + skipb;
for(j = 0; j < qb; ++j, skipa += qa)
h_3d[i][j] = h_3d[0][0] + skipa;
}
// Modal memory
for(i = 0; i < NPyr_verts; ++i, ++new_hj)
vert[i].hj = new_hj;
for(i = 0; i < NPyr_edges; ++i){
edge[i].hj = new_hj;
new_hj += edge[i].l;
}
double *p = new_hj;
for(i = 0; i < NPyr_faces; ++i)
if (ll=face[i].l){
face[i].hj = (double **)malloc(ll*sizeof(double *));
if(Nfverts(i) == 4) //OVERLOAD CALL: Nfverts: Nums.c(Tri), Nums.c(Quad), Nums.c(Tet), Nums.c(Pyr), Nums.c(Prism), Nums.c(Hex), Nums.c(Element)
for(j = 0; j < ll; p+=ll, ++j)
face[i].hj[j] = p;
else
for(j = 0; j < ll; p+=ll-j, ++j)
face[i].hj[j] = p;
}
else face[i].hj = (double **)malloc(sizeof(double *));
// interior modes
if(interior_l){
hj_3d = (double ***)malloc(interior_l*sizeof(double**));
double **p1;
p1 = (double **)malloc(interior_l*interior_l*sizeof(double *));
for(i = 0; i < interior_l;p1+=interior_l-i,++i){
hj_3d[i] = p1;
for(j = 0; j < interior_l-i; p += interior_l-i-j,++j)
hj_3d[i][j] = p;
}
}
}
void Prism::Mem_shift(double *new_h, double *new_hj, char trip){
// Physical memory
register int i,j,ll;
int skipa,skipb;
h_3d = (double ***) malloc(qc*sizeof(double **));
h_3d[0] = (double **) malloc(qc*qb*sizeof(double *));
h_3d[0][0] = new_h;
skipa = skipb = 0;
for(i = 0; i < qc; ++i, skipb += qb){
h_3d[i] = h_3d[0] + skipb;
for(j = 0; j < qb; ++j, skipa += qa)
h_3d[i][j] = h_3d[0][0] + skipa;
}
// Modal memory
for(i = 0; i < NPrism_verts; ++i, ++new_hj)
vert[i].hj = new_hj;
for(i = 0; i < NPrism_edges; ++i){
edge[i].hj = new_hj;
new_hj += edge[i].l;
}
double *p = new_hj;
for(i = 0; i < NPrism_faces; ++i)
if (ll=face[i].l){
face[i].hj = (double **)malloc(ll*sizeof(double *));
if(Nfverts(i) == 4) //OVERLOAD CALL: Nfverts: Nums.c(Tri), Nums.c(Quad), Nums.c(Tet), Nums.c(Pyr), Nums.c(Prism), Nums.c(Hex), Nums.c(Element)
for(j = 0; j < ll; p+=ll, ++j)
face[i].hj[j] = p;
else
for(j = 0; j < ll; p+=ll-j, ++j)
face[i].hj[j] = p;
}
else face[i].hj = (double **)malloc(sizeof(double *));
// interior modes
if(interior_l){
hj_3d = (double ***)malloc((interior_l-1)*sizeof(double**));
double **p1;
p1 = (double **)malloc(interior_l*(interior_l)*sizeof(double *));
for(i = 0; i < interior_l-1;p1+=interior_l,++i){
hj_3d[i] = p1;
for(j = 0; j < interior_l;p+=interior_l-1-i,++j)
hj_3d[i][j] = p;
}
}
}
void Hex::Mem_shift(double *new_h, double *new_hj, char trip){
// Physical memory
register int i,j,ll;
int totbc,totc;
int skipa,skipb;
totbc = qb*qa;
totc = qc;
h_3d = (double ***) malloc(totc*sizeof(double **));
h_3d[0] = (double **) malloc(totbc*sizeof(double *));
h_3d[0][0] = new_h;
skipa = skipb = 0;
for(i = 0; i < qc; ++i, skipb += qb){
h_3d[i] = h_3d[0] + skipb;
for(j = 0; j < qb; ++j, skipa += qa)
h_3d[i][j] = h_3d[0][0] + skipa;
}
// Modal memory
for(i = 0; i < NHex_verts; ++i, ++new_hj)
vert[i].hj = new_hj;
for(i = 0; i < NHex_edges; ++i){
edge[i].hj = new_hj;
new_hj += edge[i].l;
}
double *p = new_hj;
for(i = 0; i < NHex_faces; ++i)
if (ll=face[i].l){
face[i].hj = (double **)malloc(ll*sizeof(double *));
for(j = 0; j < ll; p+=ll, ++j)
face[i].hj[j] = p;
}
else face[i].hj = (double **)malloc(sizeof(double *));
// interior modes
if(interior_l){
hj_3d = (double ***)malloc(interior_l*sizeof(double**));
double **p1;
p1 = (double **)malloc((interior_l*interior_l)*sizeof(double *));
for(i = 0; i < interior_l;p1+=interior_l,++i){
hj_3d[i] = p1;
for(j = 0; j < interior_l;p+=interior_l,++j)
hj_3d[i][j] = p;
}
}
}
void Element::Mem_shift(double *, double *, char){ERR;} //OVERLOAD CALL: ERR: Element.c(?), hotel.h(?)
/*
Function name: Element::mat_mem
Function Purpose:
Function Notes:
*/
LocMat *Tri::mat_mem(){
LocMat *m = (LocMat *)calloc(1,sizeof(LocMat));
int bsize,isize,i;
bsize = Nverts;
for(i=0;i<Nedges;++i)
bsize += edge[i].l;
isize = 0;
for(i=0;i<Nfaces;++i)
isize += Nfmodes(); //OVERLOAD CALL: Nfmodes: Nums.c(Tri), Nums.c(Quad), Nums.c(Tet), Nums.c(Pyr), Nums.c(Prism), Nums.c(Hex), Nums.c(Element)
m->asize = bsize;
m->csize = isize;
m->list = ivector(0,bsize-1);
m->a = dmatrix(0,bsize-1,0,bsize-1);
dzero(bsize*bsize, m->a[0], 1);
if(isize){
m->b = dmatrix(0,bsize-1,0,isize-1);
m->c = dmatrix(0,isize-1,0,isize-1);
dzero(bsize*isize, m->b[0], 1);
dzero(isize*isize, m->c[0], 1);
if(option("Oseen")){
m->d = dmatrix(0,bsize-1,0,isize-1);
dzero(isize*bsize, m->d[0],1);
}
else
m->d = (double **)NULL;
}
return m;
}
LocMat *Quad::mat_mem(){
LocMat *m = (LocMat *)malloc(sizeof(LocMat));
int bsize,isize,i;
bsize = Nverts;
for(i=0;i<Nedges;++i)
bsize += edge[i].l;
isize = 0;
for(i=0;i<Nfaces;++i)
isize += face[i].l*face[i].l;
m->asize = bsize;
m->csize = isize;
m->list = ivector(0,bsize-1);
m->a = dmatrix(0,bsize-1,0,bsize-1);
dzero(bsize*bsize, m->a[0], 1);
if(isize){
m->b = dmatrix(0,bsize-1,0,isize-1);
m->c = dmatrix(0,isize-1,0,isize-1);
dzero(bsize*isize, m->b[0], 1);
dzero(isize*isize, m->c[0], 1);
if(option("Oseen")){
m->d = dmatrix(0,bsize-1,0,isize-1);
dzero(isize*bsize, m->d[0],1);
}
else
m->d = (double **)NULL;
}
return m;
}
LocMat *Tet::mat_mem(){
LocMat *m = (LocMat *)malloc(sizeof(LocMat));
int bsize,isize;
bsize = Nbmodes;
isize = Nmodes - Nbmodes;
m->asize = bsize;
m->csize = isize;
m->list = ivector(0,bsize-1);
m->a = dmatrix(0,bsize-1,0,bsize-1);
dzero(bsize*bsize, m->a[0], 1);
if(isize){
m->b = dmatrix(0,bsize-1,0,isize-1);
m->c = dmatrix(0,isize-1,0,isize-1);
dzero(bsize*isize, m->b[0], 1);
dzero(isize*isize, m->c[0], 1);
}
return m;
}
LocMat *Pyr::mat_mem(){
LocMat *m = (LocMat *)malloc(sizeof(LocMat));
int bsize,isize;
bsize = Nbmodes;
isize = Nmodes - Nbmodes;
m->asize = bsize;
m->csize = isize;
m->list = ivector(0,bsize-1);
m->a = dmatrix(0,bsize-1,0,bsize-1);
dzero(bsize*bsize, m->a[0], 1);
if(isize){
m->b = dmatrix(0,bsize-1,0,isize-1);
m->c = dmatrix(0,isize-1,0,isize-1);
dzero(bsize*isize, m->b[0], 1);
dzero(isize*isize, m->c[0], 1);
}
return m;
}
LocMat *Prism::mat_mem(){
LocMat *m = (LocMat *)malloc(sizeof(LocMat));
int bsize,isize;
bsize = Nbmodes;
isize = Nmodes - Nbmodes;
m->asize = bsize;
m->csize = isize;
m->list = ivector(0,bsize-1);
m->a = dmatrix(0,bsize-1,0,bsize-1);
dzero(bsize*bsize, m->a[0], 1);
if(isize){
m->b = dmatrix(0,bsize-1,0,isize-1);
m->c = dmatrix(0,isize-1,0,isize-1);
dzero(bsize*isize, m->b[0], 1);
dzero(isize*isize, m->c[0], 1);
}
return m;
}
LocMat *Hex::mat_mem(){
LocMat *m = (LocMat *)malloc(sizeof(LocMat));
int bsize,isize;
bsize = Nbmodes;
isize = Nmodes - Nbmodes;
m->asize = bsize;
m->csize = isize;
m->list = ivector(0,bsize-1);
m->a = dmatrix(0,bsize-1,0,bsize-1);
dzero(bsize*bsize, m->a[0], 1);
if(isize){
m->b = dmatrix(0,bsize-1,0,isize-1);
m->c = dmatrix(0,isize-1,0,isize-1);
dzero(bsize*isize, m->b[0], 1);
dzero(isize*isize, m->c[0], 1);
}
return m;
}
LocMat *Element::mat_mem(){ERR;return (LocMat*)NULL;} //OVERLOAD CALL: ERR: Element.c(?), hotel.h(?)
/*
Function name: Element::mat_free
Function Purpose:
Argument 1: LocMat *m
Purpose:
Function Notes:
*/
void Tri::mat_free(LocMat *m){
free(m->list);
free_dmatrix(m->a,0,0);
if(m->csize){
free_dmatrix(m->b,0,0);
free_dmatrix(m->c,0,0);
if(m->d)
free_dmatrix(m->d,0,0);
}
free(m);
}
void Quad::mat_free(LocMat *m){
free(m->list);
free_dmatrix(m->a,0,0);
if(m->csize){
free_dmatrix(m->b,0,0);
free_dmatrix(m->c,0,0);
if(m->d)
free_dmatrix(m->d,0,0);
}
free(m);
}
void Tet::mat_free(LocMat *m){
free(m->list);
free_dmatrix(m->a,0,0);
if(m->csize){
free_dmatrix(m->b,0,0);
free_dmatrix(m->c,0,0);
}
free(m);
}
void Pyr::mat_free(LocMat *m){
free(m->list);
free_dmatrix(m->a,0,0);
if(m->csize){
free_dmatrix(m->b,0,0);
free_dmatrix(m->c,0,0);
}
free(m);
}
void Prism::mat_free(LocMat *m){
free(m->list);
free_dmatrix(m->a,0,0);
if(m->csize){
free_dmatrix(m->b,0,0);
free_dmatrix(m->c,0,0);
}
free(m);
}
void Hex::mat_free(LocMat *m){
free(m->list);
free_dmatrix(m->a,0,0);
if(m->csize){
free_dmatrix(m->b,0,0);
free_dmatrix(m->c,0,0);
}
free(m);
}
void Element::mat_free(LocMat *){ERR;} //OVERLOAD CALL: ERR: Element.c(?), hotel.h(?)
/*
Function name: Element::divmat_mem
Function Purpose:
Argument 1: Element *P
Purpose:
Function Notes:
*/
LocMatDiv *Tri::divmat_mem(Element *P){
LocMatDiv *m = (LocMatDiv *)malloc(sizeof(LocMatDiv));
int bsize,isize,psize,i;
psize = Nverts;
bsize = Nverts;
for(i=0;i<Nedges;++i){
bsize += edge[i].l;
psize += P->edge[i].l;
}
isize = 0;
for(i=0;i<Nfaces;++i){
isize += face[i].l*(face[i].l+1)/2;
psize += P->face[i].l*(P->face[i].l+1)/2;
}
m->bsize = bsize;
m->isize = isize;
m->rows = psize;
m->Atot = dmatrix(0,2*bsize,0,2*bsize);
m->Dxb = dmatrix(0,psize-1,0,bsize-1);
dzero(psize*bsize, m->Dxb[0], 1);
m->Dyb = dmatrix(0,psize-1,0,bsize-1);
dzero(psize*bsize, m->Dyb[0], 1);
if(isize){
m->Dxi = dmatrix(0,psize-1,0,isize-1);
dzero(psize*isize, m->Dxi[0], 1);
m->Dyi = dmatrix(0,psize-1,0,isize-1);
dzero(psize*isize, m->Dyi[0], 1);
}
return m;
}
LocMatDiv *Quad::divmat_mem(Element *P){
LocMatDiv *m = (LocMatDiv *)malloc(sizeof(LocMatDiv));
int bsize,isize,psize,i;
psize = Nverts;
bsize = Nverts;
for(i=0;i<Nedges;++i){
bsize += edge[i].l;
psize += P->edge[i].l;
}
isize = 0;
for(i=0;i<Nfaces;++i){
isize += face[i].l*face[i].l;
psize += P->face[i].l*P->face[i].l;
}
m->bsize = bsize;
m->isize = isize;
m->rows = psize;
m->Atot = dmatrix(0,2*bsize,0,2*bsize);
m->Dxb = dmatrix(0,psize-1,0,bsize-1);
dzero(psize*bsize, m->Dxb[0], 1);
m->Dyb = dmatrix(0,psize-1,0,bsize-1);
dzero(psize*bsize, m->Dyb[0], 1);
if(isize){
m->Dxi = dmatrix(0,psize-1,0,isize-1);
dzero(psize*isize, m->Dxi[0], 1);
m->Dyi = dmatrix(0,psize-1,0,isize-1);
dzero(psize*isize, m->Dyi[0], 1);
}
return m;
}
LocMatDiv *Element::divmat_mem(Element *){ERR;return NULL;} //OVERLOAD CALL: ERR: Element.c(?), hotel.h(?)
/*
Function name: Element::divmat_free
Function Purpose:
Argument 1: LocMatDiv *m
Purpose:
Function Notes:
*/
void Tri::divmat_free(LocMatDiv *m){
free_dmatrix(m->Atot,0,0);
free_dmatrix(m->Dxb,0,0);
free_dmatrix(m->Dyb,0,0);
if(m->isize){
free_dmatrix(m->Dxi,0,0);
free_dmatrix(m->Dyi,0,0);
}
free(m);
}
void Quad::divmat_free(LocMatDiv *m){
free_dmatrix(m->Atot,0,0);
free_dmatrix(m->Dxb,0,0);
free_dmatrix(m->Dyb,0,0);
if(m->isize){
free_dmatrix(m->Dxi,0,0);
free_dmatrix(m->Dyi,0,0);
}
free(m);
}
void Element::divmat_free(LocMatDiv *){ERR;} //OVERLOAD CALL: ERR: Element.c(?), hotel.h(?)
/*
Function name: Element::MemBndry
Function Purpose:
Argument 1: Bndry *B
Purpose:
Argument 2: int fac
Purpose:
Argument 3: int Je
Purpose:
Function Notes:
*/
void Tri::MemBndry(Bndry *B, int fac, int Je){
int L;
B->bvert = dvector(0,Je*Tri_DIM-1); //OVERLOAD CALL: Tri_DIM: hotel.h(?), Tri.c(?)
dzero(Je*Tri_DIM,B->bvert,1); //OVERLOAD CALL: Tri_DIM: hotel.h(?), Tri.c(?)
if(L = edge[fac].l){
B->bedge[0] = dvector(0,Je*L-1);
dzero(Je*L,B->bedge[0],1);
}
}
void Quad::MemBndry(Bndry *B, int fac, int Je){
int L;
B->bvert = (double *)calloc(Je*Quad_DIM,sizeof(double));
if(L = edge[fac].l)
B->bedge[0] = (double *)calloc(Je*L,sizeof(double));
}
void Tet::MemBndry(Bndry *B, int fac, int Je){
int L;
register int i;
B->bvert = (double *)calloc(Je*Tet_DIM ,sizeof(double));
for(i = 0; i < Nfverts(fac); ++i) //OVERLOAD CALL: Nfverts: Nums.c(Tri), Nums.c(Quad), Nums.c(Tet), Nums.c(Pyr), Nums.c(Prism), Nums.c(Hex), Nums.c(Element)
if(L = edge[ednum(fac,i)].l) //OVERLOAD CALL: ednum: Nums.c(Tri), Nums.c(Quad), Nums.c(Tet), Nums.c(Pyr), Nums.c(Prism), Nums.c(Hex), Nums.c(Element)
B->bedge[i] = (double *)calloc(Je*L,sizeof(double));
if(L = face[fac].l){
B->bface = (double **)malloc(L*sizeof(double*));
B->bface[0] = dvector(0,Je*(L*(L+1)/2)-1);
for(i = 1; i < L; ++i) B->bface[i] = B->bface[i-1] + L+1-i;
dzero(Je*(L*(L+1)/2),B->bface[0],1);
}
else
B->bface = (double **)malloc(sizeof(double *));
}
void Pyr::MemBndry(Bndry *B, int fac, int Je){
int L;
register int i;
B->bvert = (double *)calloc(Je*Nfverts(fac) ,sizeof(double)); //OVERLOAD CALL: Nfverts: Nums.c(Tri), Nums.c(Quad), Nums.c(Tet), Nums.c(Pyr), Nums.c(Prism), Nums.c(Hex), Nums.c(Element)
for(i = 0; i < Nfverts(fac); ++i) //OVERLOAD CALL: Nfverts: Nums.c(Tri), Nums.c(Quad), Nums.c(Tet), Nums.c(Pyr), Nums.c(Prism), Nums.c(Hex), Nums.c(Element)
if(L = edge[ednum(fac,i)].l) //OVERLOAD CALL: ednum: Nums.c(Tri), Nums.c(Quad), Nums.c(Tet), Nums.c(Pyr), Nums.c(Prism), Nums.c(Hex), Nums.c(Element)
B->bedge[i] = (double *)calloc(Je*L,sizeof(double));
if(L = face[fac].l){
B->bface = (double **)malloc(L*sizeof(double*));
if(Nfverts(fac) == 4){ //OVERLOAD CALL: Nfverts: Nums.c(Tri), Nums.c(Quad), Nums.c(Tet), Nums.c(Pyr), Nums.c(Prism), Nums.c(Hex), Nums.c(Element)
B->bface[0] = dvector(0,Je*L*L-1);
for(i = 1; i < L; ++i) B->bface[i] = B->bface[i-1] + L;
dzero(Je*L*L,B->bface[0],1);
}
else{
B->bface[0] = dvector(0,Je*L*(L+1)/2-1);
for(i = 1; i < L; ++i) B->bface[i] = B->bface[i-1] + L+1-i;
dzero(Je*L*(L+1)/2,B->bface[0],1);
}
}
else
B->bface = (double **)malloc(sizeof(double *));
}
void Prism::MemBndry(Bndry *B, int fac, int Je){
int L;
register int i;
B->bvert = (double *)calloc(Je*Nfverts(fac) ,sizeof(double)); //OVERLOAD CALL: Nfverts: Nums.c(Tri), Nums.c(Quad), Nums.c(Tet), Nums.c(Pyr), Nums.c(Prism), Nums.c(Hex), Nums.c(Element)
for(i = 0; i < Nfverts(fac); ++i) //OVERLOAD CALL: Nfverts: Nums.c(Tri), Nums.c(Quad), Nums.c(Tet), Nums.c(Pyr), Nums.c(Prism), Nums.c(Hex), Nums.c(Element)
if(L = edge[ednum(fac,i)].l) //OVERLOAD CALL: ednum: Nums.c(Tri), Nums.c(Quad), Nums.c(Tet), Nums.c(Pyr), Nums.c(Prism), Nums.c(Hex), Nums.c(Element)
B->bedge[i] = (double *)calloc(Je*L,sizeof(double));
if(L = face[fac].l){
B->bface = (double **)malloc(L*sizeof(double*));
if(Nfverts(fac) == 4){ //OVERLOAD CALL: Nfverts: Nums.c(Tri), Nums.c(Quad), Nums.c(Tet), Nums.c(Pyr), Nums.c(Prism), Nums.c(Hex), Nums.c(Element)
B->bface[0] = dvector(0,Je*L*L-1);
for(i = 1; i < L; ++i) B->bface[i] = B->bface[i-1] + L;
dzero(Je*L*L,B->bface[0],1);
}
else{
B->bface[0] = dvector(0,Je*(L*(L+1)/2)-1);
for(i = 1; i < L; ++i) B->bface[i] = B->bface[i-1] + L+1-i;
dzero(Je*(L*(L+1)/2),B->bface[0],1);
}
}
else
B->bface = (double **)calloc(1,sizeof(double *));
}
void Hex::MemBndry(Bndry *B, int fac, int Je){
int L;
register int i;
B->bvert = (double *)calloc(Je*Nfverts(fac) ,sizeof(double)); //OVERLOAD CALL: Nfverts: Nums.c(Tri), Nums.c(Quad), Nums.c(Tet), Nums.c(Pyr), Nums.c(Prism), Nums.c(Hex), Nums.c(Element)
for(i = 0; i < Nfverts(fac); ++i) //OVERLOAD CALL: Nfverts: Nums.c(Tri), Nums.c(Quad), Nums.c(Tet), Nums.c(Pyr), Nums.c(Prism), Nums.c(Hex), Nums.c(Element)
if(L = edge[ednum(fac,i)].l) //OVERLOAD CALL: ednum: Nums.c(Tri), Nums.c(Quad), Nums.c(Tet), Nums.c(Pyr), Nums.c(Prism), Nums.c(Hex), Nums.c(Element)
B->bedge[i] = (double *)calloc(Je*L,sizeof(double));
if(L = face[fac].l){
B->bface = (double **)malloc(L*sizeof(double*));
B->bface[0] = dvector(0,Je*L*L-1);
for(i = 1; i < L; ++i) B->bface[i] = B->bface[i-1] + L;
dzero(Je*L*L,B->bface[0],1);
}
else
B->bface = (double **)calloc(1,sizeof(double *));
}
void Element::MemBndry(Bndry *, int , int ){ERR;} //OVERLOAD CALL: ERR: Element.c(?), hotel.h(?)
C++ to HTML Conversion by ctoohtml