コード例 #1
0
ファイル: solid_model.cpp プロジェクト: LANTZT/feelpp-book
void
runApplicationSolid()
{
    typedef FeelModels::SolidMechanics< Simplex<FEELPP_DIM,1>,
                                        Lagrange<OrderDisp, Vectorial,Continuous,PointSetFekete> > model_type;
    auto SM = model_type::New("solid");

    if ( SM->isStationary() )
    {
        bool algoQuasiStatic = boption(_name="solve-quasi-static");
        if ( !algoQuasiStatic )
        {
            SM->init();
            SM->printAndSaveInfo();
            SM->solve();
            SM->exportResults();
        }
        else
        {
            SM->init();
            SM->printAndSaveInfo();

            std::string variableSymbol = soption(_name="solve-quasi-static.variable-symbol");
            CHECK( SM->modelProperties().parameters().find(variableSymbol) != SM->modelProperties().parameters().end() ) << "not find symbol " << variableSymbol;
            double valueFinal = SM->modelProperties().parameters().find(variableSymbol)->second.value();
            double valueInitial = doption(_name="solve-quasi-static.variable-initial");
            double valueStep = doption(_name="solve-quasi-static.variable-step");
            int cptNeed = std::abs(valueFinal-valueInitial)/valueStep;
            double currentParam = valueInitial;

            std::string namefileVariableParameters = (fs::path(SM->rootRepository()) / fs::path("paramters-done.data")).string();

            std::string saveType = soption(_name="solve-quasi-static.save.file-format");

            int cptCurrent=1;
            if ( SM->doRestart() )
            {
                std::ifstream fileParameter(namefileVariableParameters.c_str());
                while ( ! fileParameter.eof() ) { fileParameter >> cptCurrent >> currentParam; }
                fileParameter.close();

                SM->fieldDisplacement().load(_path=SM->rootRepository()+"/"+(boost::format("uSol.field-%1%") %cptCurrent ).str(),
                                             _type=saveType );
                if ( SM->useDisplacementPressureFormulation() )
                    SM->fieldPressure().load(_path=SM->rootRepository()+"/"+(boost::format("pSol.field-%1%") %cptCurrent ).str(),
                                             _type=saveType );

                SM->restartExporters(cptCurrent);
                ++cptCurrent;
            }
            else
            {
コード例 #2
0
/*!
 * \brief 将连线图翻译成为代码
 */
void Translate::translateCode()
{
    qDebug() << "开始翻译";

    translateProgress_ = 0;
    //////////////读取翻译缓冲用数据库////////////
    QSqlDatabase dbBuffer=QSqlDatabase::addDatabase("QSQLITE","Buffer");
    dbBuffer.setDatabaseName("./resource/Blocks/Buffer.mpb");
    dbBuffer.open();

    QSqlDatabase dbDict=QSqlDatabase::addDatabase("QSQLITE","Dict");
    //读取翻译缓冲用数据库////////////

    ///////翻译之前来一腿!!!!///////////////////
    QSqlQuery pQuery_(dbBuffer);

    int counter = 0;

qDebug() << "------1-------";
    QFile fileLinkage("Linkage.csv");

    if(!fileLinkage.open(QFile::ReadOnly))
    {
        qDebug() << "文件打开失败";
        qDebug() << fileLinkage.errorString();
    }

    QTextStream in(&fileLinkage);
    pQuery_.exec("delete From Linkage");
    dbBuffer.transaction();
    counter = 0;
    while (!in.atEnd())
    {
        QString str;
        in >> str;
        qDebug() << str;
        QStringList strs = str.split(",");
qDebug() << strs.size();
        if(counter < strs.size())
        {
            QString cmd = QString("INSERT INTO Linkage VALUES('%1','%2','%3','%4')").arg(strs.at(0)).arg(strs.at(1)).arg(strs.at(2)).arg(strs.at(3));
            qDebug() << cmd;

            pQuery_.exec(cmd);

        }
        counter++;
    }
    dbBuffer.commit();
    fileLinkage.close();
    ///////////////////////////////////
    qDebug() << "------2-------";
    QFile fileParameter("Parameter.csv");

            if(!fileParameter.open(QFile::ReadOnly))
            {
                qDebug() << "文件打开失败";
                qDebug() << fileParameter.errorString();
            }

    QTextStream in1(&fileParameter);
    pQuery_.exec("delete From Parameter");
    dbBuffer.transaction();
    counter = 0;

    while (!in1.atEnd())
    {
        QString str;
        in1 >> str;
        qDebug() << str;
        QStringList strs = str.split(",");
qDebug() << strs.size();
        if(counter < strs.size())
        {
            QString cmd = QString("INSERT INTO Parameter VALUES('%1','%2','%3','%4','%5','%6','%7')").arg(strs.at(0)).arg(strs.at(1)).arg(strs.at(2)).arg(strs.at(3)).arg(strs.at(4)).arg(strs.at(5)).arg(strs.at(6));
            qDebug() << cmd;

            pQuery_.exec(cmd);
        }
        counter++;
    }
    dbBuffer.commit();
    fileParameter.close();
    ///////////////////////////////////
    qDebug() << "-------3------";
    QFile fileBB("BBList.csv");

    if(!fileBB.open(QFile::ReadOnly))
    {
        qDebug() << "文件打开失败";
        qDebug() << fileBB.errorString();
    }

    QTextStream in2(&fileBB);

    counter = 0;
pQuery_.exec("delete From BBList");
    dbBuffer.transaction();
    while (!in2.atEnd())
    {
        QString str;
        in2 >> str;
        qDebug() << str;
        QStringList strs = str.split(",");
qDebug() << strs.size();
        if(counter < strs.size())
        {
            QString cmd = QString("INSERT INTO BBList VALUES('%1','%2','%3','%4','%5','%6','%7','%8','%9','%10','%11','%12','%13','%14','%15')").arg(strs.at(0)).arg(strs.at(1)).arg(strs.at(2)).arg(strs.at(3)).arg(strs.at(4)).arg(strs.at(5)).arg(strs.at(6)).arg(strs.at(7)).arg(strs.at(8)).arg(strs.at(9)).arg(strs.at(10)).arg(strs.at(11)).arg(strs.at(12)).arg(strs.at(13)).arg(strs.at(14));
            qDebug() << cmd;

            pQuery_.exec(cmd);
        }
        counter++;
    }
    dbBuffer.commit();
    fileBB.close();
    ///////翻译之后结束的一腿!!!!///////////////////

    //////////////清空上次翻译结果////////////
    QSqlQuery queryDel(dbBuffer);
    queryDel.exec("delete from Code where ROM = '0'");
    //////////////清空上次翻译结果////////////

    QSqlQuery queryInsert(dbBuffer);
    QString queryInsertStr;
    //////////////插入参数代码////////////
    QSqlQuery queryParameter(dbBuffer);
    queryParameter.exec("select ID,Type,Value,Postfix from Parameter");
    while(queryParameter.next())
    {
        queryInsert.exec("select ID from Code where Mark = 'Variable Parameter' order by ID desc limit 1");
        queryInsert.next();

        queryInsertStr = "insert into Code values(";
        queryInsertStr += QString::number(queryInsert.value(0).toInt()+1);
        queryInsertStr += ",'"+queryParameter.value(1).toString() + " LocalParameter_" + queryParameter.value(0).toString() + queryParameter.value(3).toString() + " = " + queryParameter.value(2).toString() + ";" ;
        queryInsertStr += "','Variable Parameter',0)";
        queryInsert.exec(queryInsertStr);
    }
    //////////////插入参数代码////////////

    ////////////翻译主体(检索所有BB)////////////
    QSqlQuery queryBBList(dbBuffer);
    queryBBList.exec("select BB,Type from BBList");

    float resultCount = 0;
    queryBBList.last();
    resultCount = queryBBList.at()+1;//+1因为index从0开始
    queryBBList.first();

    //**************Report Process**************
    //qDebug()<< compileProgress;
    emit signalAdvanceProgress(++translateProgress_, resultCount+1, 500);//+1是因为前面插入参数也是一个步骤
    //**************Report Process**************

    queryBBList.seek(0);
    for (int i =0; i < resultCount ; i++)
    {  //检索BB List列表
        if (i != 0) queryBBList.next();

        QString currentBB = queryBBList.value(0).toString();
        QString currentBBType = queryBBList.value(1).toString();
        qDebug() << currentBB;

        ///////////////////清理BPIO//////////////
        for (int i = 0 ; i < 10 ; i++)
        {
            BI[i] = "Null";
            BO[i] = "Null";
            PI[i] = "Null";
            PO[i] = "Null";
        }
        ///////////////////清理BPIO//////////////
        ///////////////BI////////////////
        QString BIBaseString = currentBB + "_";

        //dbDict.setDatabaseName(("./resource/Blocks/") + currentBBType + ".mpb");
        if(!map_fileName_filePath_.contains(currentBBType))
        {
            qDebug() << "翻译的时候检查模块出错 map_fileName_filePath_没有对应的" << currentBBType;
        }
        dbDict.setDatabaseName(map_fileName_filePath_.value(currentBBType));
        dbDict.open();

        QSqlQuery queryBI(dbDict);
        QString queryBIStr = "select name from behaviorIn order by id";
        queryBI.exec(queryBIStr);

        for (int i = 0;i < 10;i++)
        {
            if (queryBI.next()){
                if (queryBI.value(0).toString() != "")
                {
                    BI[i] = BIBaseString + queryBI.value(0).toString();
                    //qDebug(BI[i]);
                }
            }
        }
        ///////////////BI////////////////
        //qDebug("==========BO===================");
        ///////////////BO///////////////
        QSqlQuery queryBO(dbDict);
        QString queryBOStr = "select name from behaviorOut order by id";
        queryBO.exec(queryBOStr);


        for (int i = 0;i < 10;i++)
        {
            if (queryBO.next()){
                if (queryBO.value(0).toString() != "")    //只运算有输出引脚的部分
                {
                    QString fromPin = currentBB + "_"+queryBO.value(0).toString();  //qDebug(fromPin);
                    //获取当前模块的输出引脚名字
                    QSqlQuery queryLinkage(dbBuffer);
                    QString queryLinkageStr = "select * from Linkage where Come = '"+fromPin+"'";
                    queryLinkage.exec(queryLinkageStr);

                    while(queryLinkage.next())
                    {
                        BO[i] = BO[i] + "," + queryLinkage.value(1).toString();
                    }
                }
            }
        }
        ///////////////BO///////////////
        //qDebug("============PI=================");
        ///////////////PI///////////////
        QString PIBaseString = "LocalParameter_";

        QSqlQuery queryPI(dbBuffer);
        QString queryPIStr = "select pi0,pi1,pi2,pi3,pi4 from BBList where BB = '"+currentBB+"'";
        queryPI.exec(queryPIStr);

        queryPI.next();
        for (int i = 0;i < 10;i++)
        {
            if (queryPI.value(i).toString() != "")
            {
                PI[i] = PIBaseString + queryPI.value(i).toString();
                //qDebug(PI[i]);
            }
        }
        ///////////////PI///////////////
        //qDebug("==========PO===================");
        ///////////////PO///////////////
        QSqlQuery queryPO(dbDict);
        QString queryPOStr = "select name from paramOut order by id";
        queryPO.exec(queryPOStr);


        for (int i = 0;i < 10;i++)
        {
            if (queryPO.next()){
                if (queryPO.value(0).toString() != "")
                {
                    QString fromPin = currentBB + "_"+queryPO.value(0).toString();  //qDebug(fromPin);
                    //获取当前模块的输出引脚名字
                    QSqlQuery queryLinkage(dbBuffer);
                    QString queryLinkageStr = "select * from Linkage where Come = '"+fromPin+"'";
                    queryLinkage.exec(queryLinkageStr);

                    while(queryLinkage.next())
                    {
                        PO[i] = PO[i] + "," + queryLinkage.value(1).toString();
                    }
                }
            }
        }
        ///////////////PO///////////////
        ////////////翻译主体(检索所有BB)////////////

        ////////////////生成BB变量///////////////
        for (int i =0; i < 10;i++)
        {
            if (BI[i] != "Null")
            {
                queryInsert.exec("select ID from Code where Mark = 'Variable Beh IO' order by ID desc limit 1");
                queryInsert.next();


                QSqlQuery queryLinkage(dbBuffer);
                QString queryLinkageStr = "select * from Linkage where Go = '"+BI[i]+"'";
                queryLinkage.exec(queryLinkageStr);

                int startAtBegin = 0;
                while(queryLinkage.next()){
                    if (queryLinkage.value(0).toString() == "Start"){
                        startAtBegin = 1;
                    }
                }
                //用于检测所有相关结果 但只保留一个结果

                //检测是否与Start连接
                queryInsertStr = "insert into Code values(";
                queryInsertStr += QString::number(queryInsert.value(0).toInt()+1);

                if (startAtBegin)
                {
                    queryInsertStr += ",'boolean " + BI[i] + " = true;";
                }else{
                    queryInsertStr += ",'boolean " + BI[i] + " = false;";
                }

                /////检测是否与Start连接 设置是否自动启动
                queryInsertStr += "','Variable Parameter',0)";
                if (BI[i] != "" && BI[i] != "Null") queryInsert.exec(queryInsertStr);
            }
        }
        //////////////////生成每个环节的代码/////////////////////
        QSqlQuery queryLib(dbDict);
        QString queryLibStr = "select codeInclude,codeClass,codeParameter,codeSetup,codePreWork,codeMainWork,codeLastWork,codeVoid from code";
        queryLib.exec(queryLibStr);
        queryLib.next();

        QString currentBBSetup;
        //////////////获取当前BB的资料//////////////

        //////////////0插入Include////////////////
        currentBBSetup = queryLib.value(0).toString();  //qDebug(currentBBSetup);

        queryInsert.exec("select ID from Code where Mark = 'Include' order by ID desc limit 1");
        queryInsert.next();

        currentBBSetup = ReplaceBPIO(currentBBSetup);

        QSqlQuery queryCheckRepeat(dbBuffer);
        QString queryCheckRepeatStr = "select Code from Code where Code = '";
        queryCheckRepeatStr += currentBBSetup;
        queryCheckRepeatStr += "'";
        queryCheckRepeat.exec(queryCheckRepeatStr);
        queryCheckRepeat.next();
        QString result = queryCheckRepeat.value(0).toString();

        if (result == "")
        {
            queryInsertStr = "insert into Code values(";
            queryInsertStr += QString::number(queryInsert.value(0).toInt()+1);
            queryInsertStr += ",'"+currentBBSetup;
            queryInsertStr += "','Include',0)";
            queryInsert.exec(queryInsertStr);
        }
        //qDebug(currentBBSetup);
        //////////////1插入Class////////////////
        currentBBSetup = queryLib.value(1).toString();  //qDebug(currentBBSetup);

        queryInsert.exec("select ID from Code where Mark = 'Variable Class' order by ID desc limit 1");
        queryInsert.next();

        currentBBSetup = ReplaceBPIO(currentBBSetup);

        queryCheckRepeatStr = "select Code from Code where Code = '";
        queryCheckRepeatStr += currentBBSetup;
        queryCheckRepeatStr += "'";
        queryCheckRepeat.exec(queryCheckRepeatStr);
        queryCheckRepeat.next();
        result = queryCheckRepeat.value(0).toString();

        if (result == "")
        {
            queryInsertStr = "insert into Code values(";
            queryInsertStr += QString::number(queryInsert.value(0).toInt()+1);
            queryInsertStr += ",'"+currentBBSetup;
            queryInsertStr += "','Variable Class',0)";
            queryInsert.exec(queryInsertStr);
        }
        //qDebug(currentBBSetup);
        //////////////2插入Parameter////////////////
        currentBBSetup = queryLib.value(2).toString();  //qDebug(currentBBSetup);

        queryInsert.exec("select ID from Code where Mark = 'Variable Parameter' order by ID desc limit 1");
        queryInsert.next();

        currentBBSetup = ReplaceBPIO(currentBBSetup);

        queryCheckRepeatStr = "select Code from Code where Code = '";
        queryCheckRepeatStr += currentBBSetup;
        queryCheckRepeatStr += "'";
        queryCheckRepeat.exec(queryCheckRepeatStr);
        queryCheckRepeat.next();
        result = queryCheckRepeat.value(0).toString();

        if (result == "")
        {
            queryInsertStr = "insert into Code values(";
            queryInsertStr += QString::number(queryInsert.value(0).toInt()+1);
            queryInsertStr += ",'"+currentBBSetup;
            queryInsertStr += "','Variable Parameter',0)";
            queryInsert.exec(queryInsertStr);
        }

        ////////////////3插入Setup资料//////////////
        currentBBSetup = queryLib.value(3).toString();  //qDebug(currentBBSetup);

        queryInsert.exec("select ID from Code where Mark = 'Pin Setup' order by ID desc limit 1");
        queryInsert.next();
        //QString queryInsertPos = queryInsert.value(0).toString(); //qDebug(queryInsertPos);
        //获取插入位置

        //
        currentBBSetup = ReplaceBPIO(currentBBSetup);

        queryCheckRepeatStr = "select Code from Code where Code = '";
        queryCheckRepeatStr += currentBBSetup;
        queryCheckRepeatStr += "'";
        queryCheckRepeat.exec(queryCheckRepeatStr);
        queryCheckRepeat.next();
        result = queryCheckRepeat.value(0).toString();

        if (result == "")
        {
            queryInsertStr = "insert into Code values(";
            queryInsertStr += QString::number(queryInsert.value(0).toInt()+1);
            queryInsertStr += ",'"+currentBBSetup;
            queryInsertStr += "','Pin Setup',0)";
            queryInsert.exec(queryInsertStr);
            //qDebug(currentBBSetup);
        }
        //////////////4插入PreWork////////////////
        currentBBSetup = queryLib.value(4).toString();  //qDebug(currentBBSetup);

        queryInsert.exec("select ID from Code where Mark = 'Pre Work' order by ID desc limit 1");
        queryInsert.next();

        //
        currentBBSetup = ReplaceBPIO(currentBBSetup);

        queryCheckRepeatStr = "select Code from Code where Code = '";
        queryCheckRepeatStr += currentBBSetup;
        queryCheckRepeatStr += "'";
        queryCheckRepeat.exec(queryCheckRepeatStr);
        queryCheckRepeat.next();
        result = queryCheckRepeat.value(0).toString();

        if (result == "")
        {
            queryInsertStr = "insert into Code values(";
            queryInsertStr += QString::number(queryInsert.value(0).toInt()+1);
            queryInsertStr += ",'"+currentBBSetup;
            queryInsertStr += "','Pre Work',0)";
            queryInsert.exec(queryInsertStr);
        }
        //qDebug(currentBBSetup);
        //////////////5插入MainWork////////////////
        currentBBSetup = queryLib.value(5).toString();  //qDebug(currentBBSetup);

        queryInsert.exec("select ID from Code where Mark = 'Main Work' order by ID desc limit 1");
        queryInsert.next();

        currentBBSetup = ReplaceBPIO(currentBBSetup);

        queryCheckRepeatStr = "select Code from Code where Code = '";
        queryCheckRepeatStr += currentBBSetup;
        queryCheckRepeatStr += "'";
        queryCheckRepeat.exec(queryCheckRepeatStr);
        queryCheckRepeat.next();
        result = queryCheckRepeat.value(0).toString();

        if (result == "")
        {
            queryInsertStr = "insert into Code values(";
            queryInsertStr += QString::number(queryInsert.value(0).toInt()+1);
            queryInsertStr += ",'"+currentBBSetup;
            queryInsertStr += "','Main Work',0)";
            queryInsert.exec(queryInsertStr);
        }

        //////////////6插入LastWork////////////////
        currentBBSetup = queryLib.value(6).toString();  //qDebug(currentBBSetup);

        queryInsert.exec("select ID from Code where Mark = 'Last Work' order by ID desc limit 1");
        queryInsert.next();

        currentBBSetup = ReplaceBPIO(currentBBSetup);

        queryCheckRepeatStr = "select Code from Code where Code = '";
        queryCheckRepeatStr += currentBBSetup;
        queryCheckRepeatStr += "'";
        queryCheckRepeat.exec(queryCheckRepeatStr);
        queryCheckRepeat.next();
        result = queryCheckRepeat.value(0).toString();

        if (result == "")
        {
            if (currentBBSetup != "")
            {
                queryInsertStr = "insert into Code values(";
                queryInsertStr += QString::number(queryInsert.value(0).toInt()+1);
                queryInsertStr += ",'"+currentBBSetup;
                queryInsertStr += "','Last Work',0)";
                queryInsert.exec(queryInsertStr);
            }
        }
        //////////////7插入VoidWork////////////////
        currentBBSetup = queryLib.value(7).toString();  //qDebug(currentBBSetup);

        queryInsert.exec("select ID from Code where Mark = 'Void Work' order by ID desc limit 1");
        queryInsert.next();

        //
        currentBBSetup = ReplaceBPIO(currentBBSetup);

        queryInsertStr = "insert into Code values(";
        queryInsertStr += QString::number(queryInsert.value(0).toInt()+1);
        queryInsertStr += ",'"+currentBBSetup;
        queryInsertStr += "','Void Work',0)";
        queryInsert.exec(queryInsertStr);

        //**************Report Process**************
        //qDebug()<< compileProgress;
        emit signalAdvanceProgress(++translateProgress_, resultCount+1, 500);//+1是因为前面插入参数也是一个步骤
        //**************Report Process**************
    }

    dbDict.close();

    qDebug("Success GenCode !!!");
    /////////////////////Save File//////////////////


    //    {
    //        //确保目录存在
    //        QFileInfo infro(fileSavePath_);
    //        QDir dir(infro.path());
    //        if(dir.exists())
    //        {
    //            qDebug() << "The Temp dir not exists, and will be create it";
    //            if(!dir.mkpath(infro.path()))
    //            {
    //                qDebug() << "create Temp fail";
    //            }
    //        }
    //    }
    QFile file(fileSavePath_);
    if (!file.open(QIODevice::WriteOnly))
    {
        emit signalTranslateError();
        emit signalError(FileError);
        return;
    }
    QTextStream stream(&file);
    //创建文件和文件流

    QSqlQuery query(dbBuffer);
    query.exec("select Code from Code order by ID");
    //以下执行相关QSL语句
    while(query.next())
    {
        QString string = query.value(0).toString();
        //qDebug(qPrintable( string ));
        //qDebug(string);
        if (string != "")
        {
            stream<<string<<endl;
        }
        //将Code的每一行都写入文件中
    }
    /////////////////////Save File//////////////////
    qDebug("Success Save File  !!!");
    dbBuffer.close();
    file.close();
}