Browse Source

Refactoring due weird definitions

master
Julio Biason 2 years ago
parent
commit
7e49156a21
  1. 51
      pestfoamtest/resources/createPatchDict
  2. 61
      pestfoamtest/resources/fvSchemes
  3. 80
      pestfoamtest/src/foam.pest
  4. 223
      pestfoamtest/src/lib.rs

51
pestfoamtest/resources/createPatchDict

@ -0,0 +1,51 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2212 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object createPatchDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
pointSync false;
patches
(
{
//- Master side patch
name AMI1;
patchInfo
{
type cyclicAMI;
matchTolerance 0.0001;
neighbourPatch AMI2;
transform noOrdering;
}
constructFrom patches;
patches (AMI);
}
{
//- Slave side patch
name AMI2;
patchInfo
{
type cyclicAMI;
matchTolerance 0.0001;
neighbourPatch AMI1;
transform noOrdering;
}
constructFrom patches;
patches (AMI_slave);
}
);
// ************************************************************************* //

61
pestfoamtest/resources/fvSchemes

@ -0,0 +1,61 @@
/*--------------------------------*- C++ -*----------------------------------*\
| ========= | |
| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
| \\ / O peration | Version: v2212 |
| \\ / A nd | Website: www.openfoam.com |
| \\/ M anipulation | |
\*---------------------------------------------------------------------------*/
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object fvSchemes;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
ddtSchemes
{
default Euler;
}
gradSchemes
{
default Gauss linear;
}
divSchemes
{
default none;
div(phi,U) Gauss linearUpwind grad(U);
div(U) Gauss linear;
div(phi,k) Gauss linearUpwind grad(U);
div(phi,omega) Gauss linearUpwind grad(U);
div((nuEff*dev2(T(grad(U))))) Gauss linear;
}
laplacianSchemes
{
default Gauss linear corrected;
}
interpolationSchemes
{
default linear;
}
snGradSchemes
{
default corrected;
}
wallDist
{
method meshWave;
}
// ************************************************************************* //

80
pestfoamtest/src/foam.pest

@ -1,37 +1,49 @@
whitespace = _{ " " | "\t" | "\r" | "\n" } whitespace = _{ " " | "\t" | "\r" | "\n" }
letters = _{ 'a'..'z' | 'A'..'Z' }
numbers = _{ '0'..'9' }
special_chars = _{ "_" | "(" | ")" | "." | "*" }
multi_comment = { "/*" ~ (!"*/" ~ ANY)* ~ "*/" } multi_comment = { "/*" ~ (!"*/" ~ ANY)* ~ "*/" }
single_comment = { "//" ~ (!NEWLINE ~ ANY)* } single_comment = { "//" ~ (!NEWLINE ~ ANY)* }
identifier = { ASCII_ALPHA+ ~ (ASCII_ALPHA | ASCII_DIGIT | "_")* }
rvalue = { ('a'..'z' | 'A'..'Z' | '0'..'9' | "_" | "." | "-")+ } in_between = { (whitespace | multi_comment)+ }
middle = { (whitespace | multi_comment)+ }
definition = { letters ~ (letters | numbers | special_chars)+ }
include = { "#" ~ identifier ~ middle ~ "\"" ~ identifier ~ "\"" } value = { (letters | numbers | special_chars)+ }
attribution = { identifier ~ middle ~ rvalue ~ ";" }
dictionary = { identifier ~ middle ~ "{" ~ ( attribution = { definition ~ in_between+ ~ value ~ (in_between+ ~ value)* ~ ";" }
dictionary
| list
| attribution /* identifier = { letters+ ~ (!whitespace ~ (letters | numbers | "_" | "(" | ")" | "," | "*"))* } */
| whitespace /* rvalue = { ('a'..'z' | 'A'..'Z' | '0'..'9' | "_" | "." | "-" | "(" | ")")+ } */
| multi_comment
| single_comment /* include = { "#" ~ identifier ~ in_between ~ "\"" ~ identifier ~ "\"" } */
| include /* attribution = { identifier ~ (in_between ~ rvalue)+ ~ ";" } */
)+ ~ "}" } /* dictionary = { identifier ~ in_between ~ "{" ~ ( */
list_size = _{ ASCII_DIGIT+ ~ whitespace+ } /* dictionary */
list_middle = { "(" ~ ( /* | list */
dictionary /* | attribution */
| rvalue /* | whitespace */
| list_middle /* | multi_comment */
| whitespace /* | single_comment */
| multi_comment /* | include */
| single_comment /* )+ ~ "}" } */
)+ ~ ")" } /* list_size = _{ ASCII_DIGIT+ ~ whitespace+ } */
list = { identifier ~ middle ~ list_size? ~ list_middle ~ ";" } /* list_middle = { "(" ~ ( */
/* dictionary */
file = { SOI ~ ( /* | rvalue */
whitespace /* | list_middle */
| multi_comment /* | whitespace */
| single_comment /* | multi_comment */
| dictionary /* | single_comment */
| list /* )+ ~ ")" } */
| attribution)* /* list = { identifier ~ in_between ~ list_size? ~ list_middle ~ ";" } */
~ EOI }
/* file = { SOI ~ ( */
/* whitespace */
/* | multi_comment */
/* | single_comment */
/* | dictionary */
/* | list */
/* | attribution)* */
/* ~ EOI } */

223
pestfoamtest/src/lib.rs

@ -22,122 +22,149 @@ mod parser {
} }
#[test] #[test]
fn broken_multi() { fn definition() {
let parse = FoamParser::parse(Rule::multi_comment, "/* bad comment"); let parse = FoamParser::parse(Rule::definition, "foamFile");
assert!(parse.is_err()); assert!(parse.is_ok(), "{:#?}", parse);
} let parse = FoamParser::parse(Rule::definition, "div(phi,U)");
assert!(parse.is_ok(), "{:#?}", parse);
#[test] let parse = FoamParser::parse(Rule::definition, "div((nuEff*dev2(T(grad(U)))))");
fn single_comment() { assert!(parse.is_ok(), "{:#?}", parse);
let parse = FoamParser::parse(Rule::single_comment, "// this is comment"); let parse = FoamParser::parse(Rule::definition, "FoamFile");
assert!(parse.is_ok()); assert!(parse.is_ok(), "{:#?}", parse);
} let parse = FoamParser::parse(Rule::definition, "foam_file");
#[test]
fn identifier() {
let parse = FoamParser::parse(Rule::identifier, "FoamFile");
assert!(parse.is_ok());
let parse = FoamParser::parse(Rule::identifier, "foam_file");
assert!(parse.is_ok()); assert!(parse.is_ok());
} }
#[test]
fn broken_identifer() {
let parse = FoamParser::parse(Rule::identifier, "123");
assert!(parse.is_err());
let parse = FoamParser::parse(Rule::identifier, "asd ");
assert!(parse.is_ok(), "{:?}", parse);
// XXX check if the identifier lost its space.
}
#[test] #[test]
fn attribution() { fn attribution() {
let parse = FoamParser::parse(Rule::attribution, "version 2.0;"); let parse = FoamParser::parse(Rule::attribution, "version 2.0;");
assert!(parse.is_ok(), "{:?}", parse);
}
#[test]
fn broken_attribution() {
let parse = FoamParser::parse(Rule::attribution, "version 2.0");
assert!(parse.is_err(), "{:?}", parse);
}
#[test]
fn dictionary() {
let text = "FoamFile\n{\nversion 2.0;\nformat ascii;\nclass dictionary;\nlocation system;\nobject caseSetupDict;\n}";
let parse = FoamParser::parse(Rule::dictionary, text);
assert!(parse.is_ok(), "{:#?}", parse); assert!(parse.is_ok(), "{:#?}", parse);
} let parse = FoamParser::parse(Rule::attribution, "div(U) Gauss linear;");
#[test]
fn dict_in_dict() {
let text = "dict1 { dict2 { class bad; } }";
let parse = FoamParser::parse(Rule::dictionary, text);
assert!(parse.is_ok(), "{:#?}", parse); assert!(parse.is_ok(), "{:#?}", parse);
} }
#[test] #[test]
fn list() { fn broken_multi() {
let text = "list_name ( 1 2 3 );"; let parse = FoamParser::parse(Rule::multi_comment, "/* bad comment");
let parse = FoamParser::parse(Rule::list, text); assert!(parse.is_err());
assert!(parse.is_ok(), "{:#?}", parse);
}
#[test]
fn sized_list() {
let text = "list_name 3 ( 1 2 3 );";
let parse = FoamParser::parse(Rule::list, text);
assert!(parse.is_ok(), "{:#?}", parse);
}
}
#[cfg(test)]
mod file {
use super::*;
use pest::Parser;
#[test]
fn chained_comments() {
let text = "/* this is one comment */\n// And this is another";
let parse = FoamParser::parse(Rule::file, text);
assert!(parse.is_ok(), "{:?}", parse);
}
#[test]
fn attribution_with_comment() {
let text = "version 2.0; // this is good";
let parse = FoamParser::parse(Rule::file, text);
assert!(parse.is_ok(), "{:?}", parse);
} }
#[test] #[test]
fn mid_comment() { fn single_comment() {
let text = "version /* this is comment */ 2.0;"; let parse = FoamParser::parse(Rule::single_comment, "// this is comment");
let parse = FoamParser::parse(Rule::file, text); assert!(parse.is_ok());
assert!(parse.is_ok(), "{:?}", parse);
} }
#[test] #[test]
fn complex() { fn broken_identifer() {
let text = "/* this is file */\nList ( 1\n2 // this is ok\n 3);"; let parse = FoamParser::parse(Rule::value, "123");
let parse = FoamParser::parse(Rule::file, text); assert!(parse.is_err(), "{:#?}", parse);
assert!(parse.is_ok(), "{:?}", parse);
}
// Note: the following files were retrieved from OpenFoam examples: let parse = FoamParser::parse(Rule::value, "asd ");
// https://develop.openfoam.com/Development/openfoam/-/tree/develop/tutorials/incompressible/pimpleFoam/RAS/rotatingFanInRoom/system
#[test]
fn control_dict() {
let text = include_bytes!("../resources/controlDict");
let parse = FoamParser::parse(Rule::file, &std::str::from_utf8(text).unwrap());
assert!(parse.is_ok(), "{:?}", parse); assert!(parse.is_ok(), "{:?}", parse);
} }
#[test] // #[test]
fn block_mesh_dict() { // fn attribution() {
let text = include_bytes!("../resources/blockMeshDict"); // let parse = FoamParser::parse(Rule::attribution, "version 2.0;");
let parse = FoamParser::parse(Rule::file, &std::str::from_utf8(text).unwrap()); // assert!(parse.is_ok(), "{:?}", parse);
assert!(parse.is_ok(), "{:?}", parse); // }
}
} // #[test]
// fn broken_attribution() {
// let parse = FoamParser::parse(Rule::attribution, "version 2.0");
// assert!(parse.is_err(), "{:?}", parse);
// }
// #[test]
// fn dictionary() {
// let text = "FoamFile\n{\nversion 2.0;\nformat ascii;\nclass dictionary;\nlocation system;\nobject caseSetupDict;\n}";
// let parse = FoamParser::parse(Rule::dictionary, text);
// assert!(parse.is_ok(), "{:#?}", parse);
// }
// #[test]
// fn dict_in_dict() {
// let text = "dict1 { dict2 { class bad; } }";
// let parse = FoamParser::parse(Rule::dictionary, text);
// assert!(parse.is_ok(), "{:#?}", parse);
// }
// #[test]
// fn list() {
// let text = "list_name ( 1 2 3 );";
// let parse = FoamParser::parse(Rule::list, text);
// assert!(parse.is_ok(), "{:#?}", parse);
// }
// #[test]
// fn sized_list() {
// let text = "list_name 3 ( 1 2 3 );";
// let parse = FoamParser::parse(Rule::list, text);
// assert!(parse.is_ok(), "{:#?}", parse);
// }
}
// #[cfg(test)]
// mod file {
// use super::*;
// use pest::Parser;
// #[test]
// fn chained_comments() {
// let text = "/* this is one comment */\n// And this is another";
// let parse = FoamParser::parse(Rule::file, text);
// assert!(parse.is_ok(), "{:?}", parse);
// }
// #[test]
// fn attribution_with_comment() {
// let text = "version 2.0; // this is good";
// let parse = FoamParser::parse(Rule::file, text);
// assert!(parse.is_ok(), "{:?}", parse);
// }
// #[test]
// fn mid_comment() {
// let text = "version /* this is comment */ 2.0;";
// let parse = FoamParser::parse(Rule::file, text);
// assert!(parse.is_ok(), "{:?}", parse);
// }
// #[test]
// fn complex() {
// let text = "/* this is file */\nList ( 1\n2 // this is ok\n 3);";
// let parse = FoamParser::parse(Rule::file, text);
// assert!(parse.is_ok(), "{:?}", parse);
// }
// // Note: the following files were retrieved from OpenFoam examples:
// // https://develop.openfoam.com/Development/openfoam/-/tree/develop/tutorials/incompressible/pimpleFoam/RAS/rotatingFanInRoom/system
// #[test]
// fn control_dict() {
// let text = include_bytes!("../resources/controlDict");
// let parse = FoamParser::parse(Rule::file, &std::str::from_utf8(text).unwrap());
// assert!(parse.is_ok(), "{:?}", parse);
// }
// #[test]
// fn block_mesh_dict() {
// let text = include_bytes!("../resources/blockMeshDict");
// let parse = FoamParser::parse(Rule::file, &std::str::from_utf8(text).unwrap());
// assert!(parse.is_ok(), "{:?}", parse);
// }
// // #[test]
// // fn create_patch_dict() {
// // let text = include_bytes!("../resources/createPatchDict");
// // let parse = FoamParser::parse(Rule::file, &std::str::from_utf8(text).unwrap());
// // assert!(parse.is_ok(), "{:?}", parse);
// // }
// #[test]
// fn fv_scheme() {
// let text = include_bytes!("../resources/fvSchemes");
// let parse = FoamParser::parse(Rule::file, &std::str::from_utf8(text).unwrap());
// assert!(parse.is_ok(), "{:?}", parse);
// }
// }

Loading…
Cancel
Save