Forward compatibility: flex
[foam-extend-3.2.git] / src / foam / db / Time / findInstance.C
blobb86e7e24f3da70ce18c4bba8c3490964a75cfd3a
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | foam-extend: Open Source CFD
4    \\    /   O peration     | Version:     3.2
5     \\  /    A nd           | Web:         http://www.foam-extend.org
6      \\/     M anipulation  | For copyright notice see file Copyright
7 -------------------------------------------------------------------------------
8 License
9     This file is part of foam-extend.
11     foam-extend is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by the
13     Free Software Foundation, either version 3 of the License, or (at your
14     option) any later version.
16     foam-extend is distributed in the hope that it will be useful, but
17     WITHOUT ANY WARRANTY; without even the implied warranty of
18     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
19     General Public License for more details.
21     You should have received a copy of the GNU General Public License
22     along with foam-extend.  If not, see <http://www.gnu.org/licenses/>.
24 Description
25     If "name" is empty: return the location of "directory"
26     If "name" is not empty: return the location of "directory" containing the
27     file "name".
28     Used in reading mesh data.
30 \*---------------------------------------------------------------------------*/
32 #include "objectRegistry.H"
33 #include "foamTime.H"
34 #include "IOobject.H"
36 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
38 Foam::word Foam::Time::findInstance
40     const fileName& dir,
41     const word& name,
42     const IOobject::readOption rOpt
43 ) const
45     // Note: if name is empty, just check the directory itself
47     // check the current time directory
48     if
49     (
50         name.empty()
51       ? isDir(path()/timeName()/dir)
52       :
53         (
54             isFile(path()/timeName()/dir/name)
55          && IOobject(name, timeName(), dir, *this).headerOk()
56         )
57     )
58     {
59         if (debug)
60         {
61             Info<< "Time::findInstance"
62                 "(const fileName&, const word&, const IOobject::readOption)"
63                 << " : found \"" << name
64                 << "\" in " << timeName()/dir
65                 << endl;
66         }
68         return timeName();
69     }
71     // Search back through the time directories to find the time
72     // closest to and lower than current time
74     instantList ts = times();
75     label instanceI;
77     for (instanceI = ts.size()-1; instanceI >= 0; --instanceI)
78     {
79         if (ts[instanceI].value() <= timeOutputValue())
80         {
81             break;
82         }
83     }
85     // continue searching from here
86     for (; instanceI >= 0; --instanceI)
87     {
88         if
89         (
90             name.empty()
91           ? isDir(path()/ts[instanceI].name()/dir)
92           :
93             (
94                 isFile(path()/ts[instanceI].name()/dir/name)
95              && IOobject(name, ts[instanceI].name(), dir, *this).headerOk()
96             )
97         )
98         {
99             if (debug)
100             {
101                 Info<< "Time::findInstance"
102                     "(const fileName&, const word&, const IOobject::readOption)"
103                     << " : found \"" << name
104                     << "\" in " << ts[instanceI].name()/dir
105                     << endl;
106             }
108             return ts[instanceI].name();
109         }
110     }
113     // not in any of the time directories, try constant
115     // Note. This needs to be a hard-coded constant, rather than the
116     // constant function of the time, because the latter points to
117     // the case constant directory in parallel cases
119     if
120     (
121         name.empty()
122       ? isDir(path()/constant()/dir)
123       :
124         (
125             isFile(path()/constant()/dir/name)
126          && IOobject(name, constant(), dir, *this).headerOk()
127         )
128     )
129     {
130         if (debug)
131         {
132             Info<< "Time::findInstance"
133                 "(const fileName&, const word&, const IOobject::readOption)"
134                 << " : found \"" << name
135                 << "\" in " << constant()/dir
136                 << endl;
137         }
139         return constant();
140     }
142     if (rOpt == IOobject::MUST_READ)
143     {
144         FatalErrorIn
145         (
146             "Time::findInstance"
147             "(const fileName&, const word&, const IOobject::readOption)"
148         )   << "Cannot find file \"" << name << "\" in directory "
149             << constant()/dir
150             << exit(FatalError);
151     }
153     return constant();
157 // ************************************************************************* //