129 lines
3.0 KiB
C++
129 lines
3.0 KiB
C++
#include<stdafx.h>
|
|
#include<stdio.h>
|
|
#include<math.h>
|
|
#include<string.h>
|
|
#include<afxtempl.h>
|
|
#include "belasolv.h"
|
|
#include "belasolvDlg.h"
|
|
#include "spars.h"
|
|
#include "mesh.h"
|
|
#include "FemmeDocCore.h"
|
|
|
|
void old_main(void *inptr)
|
|
{
|
|
CbelasolvDlg *TheView;
|
|
CFemmeDocCore Doc;
|
|
char PathName[256];
|
|
CFileDialog *fname_dia;
|
|
char outstr[1024];
|
|
int i;
|
|
|
|
TheView=(CbelasolvDlg *) inptr;
|
|
|
|
// get the name of the file to be processed,
|
|
// either from argv or from the user
|
|
if (__argc<2){
|
|
|
|
fname_dia=new CFileDialog(
|
|
TRUE,
|
|
"fem | * ",
|
|
NULL,
|
|
OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
|
|
"belaview datafile (*.fee) | *.fee; *.FEE | All Files (*.*) | *.*||",
|
|
NULL);
|
|
|
|
if(fname_dia->DoModal()==IDCANCEL){
|
|
delete[] fname_dia;
|
|
MsgBox("No file name!");
|
|
exit(0);
|
|
}
|
|
|
|
CString fname=fname_dia->GetPathName();
|
|
fname=fname.Left(fname.GetLength()-4);
|
|
strcpy(PathName,fname);
|
|
delete[] fname_dia;
|
|
}
|
|
else strcpy(PathName,__argv[1]);
|
|
|
|
Doc.PathName=PathName;
|
|
Doc.TheView=TheView;
|
|
|
|
// load problem geometry
|
|
if (Doc.OnOpenDocument()!=TRUE){
|
|
MsgBox("problem loading .fee file");
|
|
exit(7);
|
|
}
|
|
|
|
// load mesh
|
|
if (Doc.LoadMesh()!=TRUE){
|
|
MsgBox("problem loading mesh");
|
|
exit(2);
|
|
}
|
|
|
|
// label the dialog to report which problem is being solved
|
|
char PaneText[256];
|
|
char *ProbName;
|
|
ProbName=PathName;
|
|
for(i=0;i< (int) strlen(PathName);i++)
|
|
if(PathName[i]=='\\') ProbName=PathName+i;
|
|
if (strlen(PathName)>0){
|
|
ProbName++;
|
|
sprintf(PaneText,"%s - belasolve",ProbName);
|
|
}
|
|
|
|
while(!IsWindow(TheView->m_hWnd)) Sleep(1);
|
|
TheView->SetWindowText(PaneText);
|
|
|
|
// renumber using Cuthill-McKee
|
|
TheView->SetDlgItemText(IDC_STATUSWINDOW,"renumbering nodes");
|
|
if (Doc.Cuthill()!=TRUE){
|
|
MsgBox("problem renumbering nodes");
|
|
exit(3);
|
|
}
|
|
|
|
// display details about the problem to be solved
|
|
TheView->SetDlgItemText(IDC_STATUSWINDOW,"solving...");
|
|
sprintf(outstr,"Problem Statistics:\n%i nodes\n%i elements\nPrecision: %3.2e\n",
|
|
Doc.NumNodes,Doc.NumEls,Doc.Precision);
|
|
TheView->SetDlgItemText(IDC_PROBSTATS,outstr);
|
|
|
|
// initialize the problem, allocating the space required to solve it.
|
|
|
|
CBigLinProb L;
|
|
L.TheView=TheView;
|
|
L.Precision=Doc.Precision;
|
|
|
|
if (L.Create(Doc.NumNodes+Doc.NumCircProps,Doc.BandWidth)==FALSE){
|
|
MsgBox("couldn't allocate enough space for matrices");
|
|
Doc.CleanUp();
|
|
L.~CBigLinProb();
|
|
exit(4);
|
|
}
|
|
|
|
// Create element matrices and solve the problem;
|
|
if (Doc.AnalyzeProblem(L)==FALSE)
|
|
{
|
|
MsgBox("Couldn't solve the problem");
|
|
Doc.CleanUp();
|
|
L.~CBigLinProb();
|
|
exit(5);
|
|
}
|
|
|
|
TheView->SetDlgItemText(IDC_STATUSWINDOW,"Problem solved");
|
|
|
|
// now that we have results, write 'em to dist
|
|
if (Doc.WriteResults(L)==FALSE)
|
|
{
|
|
MsgBox("couldn't write results to disk");
|
|
Doc.CleanUp();
|
|
L.~CBigLinProb();
|
|
exit(6);
|
|
}
|
|
TheView->SetDlgItemText(IDC_STATUSWINDOW,"results written to disk");
|
|
|
|
// make sure that everything is freed up to avoid memory leaks
|
|
Doc.CleanUp();
|
|
L.~CBigLinProb();
|
|
exit(0);
|
|
}
|